如何从 wso2 中的 xml 检索元素的名称-space
How to retrieve name-space of an element from an xml in wso2
XML:
<Report xmlns="https://defaultnamespace/abc">
<Conversion>
<Type>FirstElement</Type>
</Conversion>
<Conversion>
<Type>SecondElement</Type>
</Conversion>
<Conversion>
<Type>ThirdElement</Type>
</Conversion>
</Report>
wso2代码:
<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 中也有类似的要求。
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: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 获取命名空间并进行转换。
<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']">
How to retrieve namespaces in XML files using Xpath
我认为上面的第二个答案post应该可以回答你的问题..
XML:
<Report xmlns="https://defaultnamespace/abc">
<Conversion>
<Type>FirstElement</Type>
</Conversion>
<Conversion>
<Type>SecondElement</Type>
</Conversion>
<Conversion>
<Type>ThirdElement</Type>
</Conversion>
</Report>
wso2代码:
<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 中也有类似的要求。
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: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 获取命名空间并进行转换。
<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']">
How to retrieve namespaces in XML files using Xpath
我认为上面的第二个答案post应该可以回答你的问题..