XML命名空间正在抛弃我的XSLT

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中删除它时,它在测试中运行良好.然而,这种解决方案并不合理,因为整个过程实际上是自动化的.所以我需要一个名称空间问题的解决方案.

有什么想法吗?

Eam*_*nne 5

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在很多小方面都比较实用,比如......)