使用xslt时丢弃的XML元素标记

时间:2015-08-11 19:53:25

标签: xml xslt transformation xml-namespaces

输入xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:orderMessageRequest xmlns:ns2="http://order.com.company.com">
<ns2:orderAck><orderNumber>25</orderNumber>
</ns2:orderAck>
</ns2:orderMessageRequest>

和xslt看起来像:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns2="http://www.company.com/services/entity/v1"
                xmlns:ns3="http://www.company.com/services/dataobject/v1"
                 xmlns:ns4="http://order.com.company.com/">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="orderAck">
        <xsl:element name="orderAcknowledgement" >
            <xsl:element name="orderNumber"><xsl:value-of select="orderNumber"/></xsl:element>
        </xsl:element>
    </xsl:template>

我在上面显示的xml上使用xslt转换然后它转换为xml元素,直接值没有元素标签,如。

<?xml version="1.0" encoding="UTF-8"?>25

如何以xml格式获取此内容。如下所示:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ns2:orderAcknowledgement      xmlns:ns2="http://www.company.com/services/dataobject/v1">   

<orderNumber>25</orderNumber>
    </ns2:orderAcknowledgement>

2 个答案:

答案 0 :(得分:1)

你已经成为两个最常见的XSLT初学者&#39;错误并将它们结合起来。

首先,您忽略了输入元素位于命名空间中的事实,除非您使用前缀限定元素名称,否则它们不会匹配样式表中的模板规则或路径表达式。< / p>

其次,您忽略了如果没有匹配元素的模板规则,默认规则就会启动,默认规则沿着树向下运行到文本节点,然后输出文本节点。

答案 1 :(得分:0)

在输入XML中,orderAck是命名空间http://order.com.company.com的一部分。但是,正如注释中所提到的,在您的XSLT中,您当前正在寻找无命名空间中的元素orderAck,这与命名空间中的元素不同。

现在,你应该能做到这一点......

<xsl:template match="ns4:orderAck">

但是这个不匹配的原因不是因为前缀不同,而是因为附加到前缀的名称空间URI在XSLT中是不同的。在你的XML中就是这个......

http://order.com.company.com

但是在你的XSLT中就是这个

http://order.com.company.com/

最后的/使它们与众不同。 (它们是URI,而不是URL)。

另请注意,使用orderAcknowledgement创建xsl:element时,您也没有指定命名空间,因此您无法获得所需的输出,因为您确实需要orderAcknowledgement在名称空间中。

试试这个XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns2="http://www.company.com/services/entity/v1"
                xmlns:ns3="http://www.company.com/services/dataobject/v1"
                 xmlns:ns4="http://order.com.company.com">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="ns4:orderAck">
        <xsl:element name="ns3:orderAcknowledgement" >
            <xsl:element name="orderNumber"><xsl:value-of select="orderNumber"/></xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

再次注意,URI是重要的,而不是前缀。 orderAcknowledgement根据需要位于名称空间http://www.company.com/services/dataobject/v1中。如果你真的想要ns2,你可以改变前缀。另请注意,在这些情况下,您实际上不需要使用xsl:element。只需正常写出元素。

尝试这个XSLT ......

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns3="http://www.company.com/services/entity/v1"
                xmlns:ns2="http://www.company.com/services/dataobject/v1"
                xmlns:ns4="http://order.com.company.com"
                exclude-result-prefixes="ns3 ns4">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="ns4:orderAck">
        <ns2:orderAcknowledgement>
            <orderNumber><xsl:value-of select="orderNumber"/></orderNumber>
        </ns2:orderAcknowledgement>
    </xsl:template>
</xsl:stylesheet>

请阅读命名空间。例如,尝试http://www.xml.com/pub/a/1999/01/namespaces.htmlhttp://www.xml.com/pub/a/2001/04/04/trxml/index.html