如何使用xslt 2.0检索xml的命名空间

时间:2015-07-06 09:32:12

标签: xml xslt xslt-2.0 xml-namespaces

XML:

<Report xmlns="https://defaultnamespace/abc">     
<Conversion>
<Type>FirstElement</Type>
</Conversion>
<Conversion>
<Type>SecondElement</Type>
</Conversion>
<Conversion>
<Type>ThirdElement</Type>
</Conversion>
<Last>This is last element</Last>
</Report>

XSLT:

<?xml version=1.0 encoding=UTF-8?>
<xsl:stylesheet xmlns:cs="https://defaultnamespace/abc">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/cs:Report/cs:Conversion/cs:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/cs:Report/cs:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>

当输入XML具有不同的命名空间时,上述XSLT失败。所以,我需要一个XSLT,它将从输入XML动态获取命名空间并进行转换。请建议我正确的解决方案。

需要进一步澄清要求请注释。提前谢谢。

有问候,Mani。

3 个答案:

答案 0 :(得分:0)

您可以尝试以下

<div class="panel-content" ng-class="panel.contentClass" data-ng-bind-html="panel.content">

答案 1 :(得分:0)

您有一些选择,可以使用通配符

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/*:Report/*:Conversion/*:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/*:Report/*:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>

或者您可以简单地声明两个名称空间

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:pf1="http://example.com/ns1" xmlns:pf2="http://example.com/ns2">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/pf1:Report/pf1:Conversion/pf1:Type | /pf2:Report/pf2:Conversion/pf2:Type">
<xsl:element name="Converting"><xsl:value-of select="."/></xsl:element>
</xsl:for-each>
<xsl:element name="LastOne"><xsl:value-of select="/pf1:Report/pf1:Last | /pf2:Report/pf2:Last"/>                  </xsl:element>
</xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

当您希望样式表在两个(或更多)/不同名称空间中对源XML进行操作时,我首选的解决方案是运行一个管道,该管道首先将XML转换为单个“规范化”命名空间,然后进行适当的转换。归一化阶段,假设它不必对内容进行任何更改,可以这样做:

<xsl:template match="node()">
  <xsl:element name="{local-name()}" namespace="http://normalized.namespace/">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>