输入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>
答案 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.html和http://www.xml.com/pub/a/2001/04/04/trxml/index.html。