如何从wso2中的xml中检索元素的名称空间

时间:2015-07-01 18:27:06

标签: xml namespaces xslt-2.0 wso2esb xml-namespaces

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获取命名空间并进行转换。

2 个答案:

答案 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

我认为上述帖子中的第二个答案将回答你的问题。