【问题标题】:How to retrieve name-space of an element from an xml in wso2如何从 wso2 中的 xml 检索元素的命名空间
【发布时间】:2015-09-19 01:25:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    How to retrieve namespaces in XML files using Xpath

    我认为上面帖子中的第二个答案应该回答你的问题..

    【讨论】:

    • 这太复杂了无法理解,我确信这不符合我的要求。
    【解决方案2】:
     <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']">
    

    【讨论】:

    • 嗨,米歇尔非常感谢您的回答。我相信上述解决方案将忽略“报告”元素附带的任何命名空间。是否有任何替代方法,例如我们检索传入 XML 的 Report 元素的命名空间,并在 xpath 表达式的迭代调解器中动态使用此命名空间。例如,首先将命名空间检索到一个属性中介体中,然后在迭代中介体中使用这个包含命名空间的属性中介体。提前致谢。
    • 谢谢米歇尔。我一定会尝试您提供的逻辑。无论如何,我在 XSLT 中也有类似的要求。 XML: ------
    • 我已经重新发布了需求。请提出解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多