Bry*_*ton 1 xml xslt xml-namespaces
我有一个xml文档,其名称空间看起来与此类似,我只是为了提问而简化它.
<MyNameSpace xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">
<IDmain>ins</IDmain>
<Table_1 class="entity">
<Address>Oak Park Drive</BillingProviderAddress>
<City>Lake Elizabeth</BillingProviderCity>
<Name>Corporation</BillingProviderOrgName>
<InvoiceLine class ="entity">
<DateService>1234</DateService>
</InvoiceLine>
<Table_1>
</MyNameSpace>
Run Code Online (Sandbox Code Playgroud)
然后我在这里创建了一个XSLT.我理解它的丑陋,我不是XSLT专家,但这是"只是解决问题"的时刻之一.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="vPrefix">
<xsl:value-of select="MyNameSpace/Table_1/Address"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/City"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/Name"/>
<xsl:text>|</xsl:text>
</xsl:variable>
<xsl:for-each select="MyNameSpace/Table_1/InvoiceLine">
<xsl:value-of select="$vPrefix"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="DateService"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
现在,XSLT完全符合我的要求,问题是,我的测试数据在XML文档的顶部包含了这个时髦的命名空间.
的xmlns = "http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace"
有两件事,我正在使用XMLPAD,当我运行脚本时,它实际上就可以使用名称空间.
不幸的是,该解决方案并不理想,因为当我尝试在我需要的另一个XSLT工具中运行它时(在运行时)它无法正常运行.
我知道命名空间正在抛弃我正在使用的XSLT,因为当我从XML中删除它时,它在测试中运行良好.然而,这种解决方案并不合理,因为整个过程实际上是自动化的.所以我需要一个名称空间问题的解决方案.
有什么想法吗?
XPath是您用来匹配特定元素的XSLT的一部分,它对名称空间敏感.如果你有一个XPath,就像MyNameSpace/Table_1/Address你匹配没有任何XML命名空间的元素一样; 即任何元素Address的子元素Table_1,它是任何元素的子元素MyNameSpace,它是当前上下文节点的子元素.
您需要添加名称空间前缀; 例如:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">
...
<xsl:value-of select="z:MyNameSpace/z:Table_1/z:Address"/>
Run Code Online (Sandbox Code Playgroud)
不幸的是,XSLT 1.0在评估XPath时不考虑当前的默认命名空间,因此您不能只设置默认命名空间并完成它; 你真的需要一个命名空间前缀.
如果可以使用XSLT 2.0,则可以使用该xpath-default-namespace属性为XPath查询中引用的元素设置默认命名空间.(XSLT 2.0在很多小方面都比较实用,比如......)