1

我被困在尝试使用 xsl 将带有名称空间的 xml 转换。这是我的文件。如您所见,我在 xsl 文档中尝试了多个 xpath 选项。我没有收到任何错误,只有一个空白文档。我已经研究了一个小时没有任何运气。提前感谢您的任何帮助!

示例.xml:

<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<POCollection xmlns:ns1="http://www.a.com/PurchaseOrder/1.0" xmlns="http://www.a.com/PurchaseOrder/1.0">
    <ns1:PurchaseOrder>
        <ns1:PurchaseOrderHeader>
            <ns1:OUAddressLine1>123 Test Street</ns1:OUAddressLine1>
        </ns1:PurchaseOrderHeader>
    </ns1:PurchaseOrder>
</POCollection>

示例.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:ns1="http://www.nsl.ns/" xmlns:d="http://www.default.ns/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:value-of select="/d:POCollection/ns1:PurchaseOrder/ns1:PurchaseOrderHeader/ns1:OUAddressLine1" />
        <xsl:value-of select="/ns1:PurchaseOrder/ns1:PurchaseOrderHeader/ns1:OUAddressLine1" />
        <xsl:value-of select="/POCollection/ns1:PurchaseOrder/ns1:PurchaseOrderHeader/ns1:OUAddressLine1" />
        <xsl:value-of select="/POCollection/PurchaseOrder/PurchaseOrderHeader/OUAddressLine1" />
        <xsl:value-of select="//OUAddressLine1" />
    </xsl:template>
</xsl:stylesheet>
4

2 回答 2

3

POCollection在 sample.xml 中具有默认命名空间xmlns="http://www.amway.com/PurchaseOrder/1.0"

那么为什么要xmlns:d="http://www.default.ns/在 XSLT 中定义呢?

<!-- in input xml is no element from "http://www.default.ns" namespace -->
<xsl:value-of select="/d:POCollection/ns1:PurchaseOrder/ns1:PurchaseOrderHeader/ns1:OUAddressLine1" />

<!-- Element ns1:PurchaseOrder is not document element (the outermost element) in input xml -->
<xsl:value-of select="/ns1:PurchaseOrder/ns1:PurchaseOrderHeader/ns1:OUAddressLine1" />

<!-- There is no element POCollection from null namespace in input xsml -->
<xsl:value-of select="/POCollection/ns1:PurchaseOrder/ns1:PurchaseOrderHeader/ns1:OUAddressLine1" />

<!-- dtto -->
<xsl:value-of select="/POCollection/PurchaseOrder/PurchaseOrderHeader/OUAddressLine1" />

<!-- dtto -->
<xsl:value-of select="//OUAddressLine1" />

编辑:以下应该工作

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:amw="http://www.amway.com/PurchaseOrder/1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:value-of select="/amw:POCollection/amw:PurchaseOrder/amw:PurchaseOrderHeader/amw:OUAddressLine1" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="//amw:PurchaseOrder/amw:PurchaseOrderHeader/amw:OUAddressLine1" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="/amw:POCollection/amw:PurchaseOrder/amw:PurchaseOrderHeader/amw:OUAddressLine1" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="//amw:OUAddressLine1" />
    </xsl:template>
</xsl:stylesheet>
于 2013-08-21T15:43:48.937 回答
0

我列出的第二个几乎是正确的,除了我排除了顶部节点的错字。这就是我最终得到的。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:ns1="http://www.nsl.ns/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/ns1:POCollection">
        <xsl:value-of select="//ns1:OUAddressLine1" />
    </xsl:template>
</xsl:stylesheet>
于 2013-08-21T15:50:41.193 回答