<Report xmlns="https://defaultnamespace/abc">
<Conversion>
<Type>FirstElement</Type>
</Conversion>
<Conversion>
<Type>SecondElement</Type>
</Conversion>
<Conversion>
<Type>ThirdElement</Type>
</Conversion>
</Report>
<inSequence>
<iterate xmlns:cs="https://defaultnamespace/abc" continueparent="true" expression="//cs:Report/cs:Conversion" attachPath="//cs:Report">
<target>
<sequence>
<xslt ket="SampleXSLT.xslt"/>
</sequence>
</target>
</iterate>
</inSequence>
问题是上面的迭代介体只有在上面的输入XML只包含命名空间“https://defaultnamespace/abc”时才有效。
如果上面的XML具有不同的命名空间,则迭代介体不起作用。因此,我需要替代解决方案,以便迭代介体动态获取来自XML的命名空间并进行转换。通过对代码进行微小修改,帮助我找到最佳解决方案。
我在XSLT中也有类似的要求。
<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>
<?xml version=1.0 encoding=UTF-8?>
<xsl:stylesheet xmlns:cs="https://defaultnamespace/abc">
<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获取命名空间并进行转换。
答案 0 :(得分:1)
<iterate preservePayload="true"
attachPath="//*[local-name()='Report']"
expression="//*[local-name()='Report']/*[local-name()='Conversion']">
<target>
<sequence>
<xslt ket="SampleXSLT.xslt"/>
</sequence>
</target>
</iterate>
如果您想使用消息中的实际命名空间:
<property name="ns" expression="namespace-uri($body/*)"/>
<iterate preservePayload="true"
attachPath="//*[namespace-uri()=$ctx:ns and local-name()='Report']"
expression="//*[namespace-uri()=$ctx:ns and local-name()='Report']/*[namespace-uri()=$ctx:ns and local-name()='Conversion']">
答案 1 :(得分:0)
How to retrieve namespaces in XML files using Xpath
我认为上述帖子中的第二个答案将回答你的问题。