3

我目前在转换文件时遇到问题。有谁可以帮助我了解问题所在?

我的源文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
    <fields>
        <field name="A">
            <field name="0216"><value>abcde</value></field>
        </field>
    <fields>
</xfdf>

我的 XSLT 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <personalData>
            <personal>
                <name>
                    <xsl:value-of select="//field[@name='A']//field[@name='0216']//value"/>
                </name>
            </personal>
        </personalData>
    </xsl:template>
</xsl:stylesheet>

输出文件是:

<?xml version="1.0" encoding="UTF-8"?>
<personalData>
    <personal>
        <name/>
    </personal>
</personalData>

我不明白为什么值是空的......

先感谢您,

马克西姆

4

1 回答 1

3

您的输入 XML 声明了一个默认命名空间xmlns="http://ns.adobe.com/xfdf/"。这意味着所有没有前缀的元素都属于这个命名空间。

因此,您还应该在 XSLT 中声明名称空间。最好带有前缀,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdf="http://ns.adobe.com/xfdf/" exclude-result-prefixes="xdf">

,exclude-result-prefixes="xdf"不会将命名空间输出到结果 XSLT 中。现在您已经声明了命名空间,您可以使用此前缀选择属于此命名空间的节点,如下所示:

<xsl:value-of select="//xdf:field[@name='A']//xdf:field[@name='0216']//xdf:value"/>

另请注意,//每次使用时都会遍历所有元素。为了更有效地编写一个 XPath,它将直接找到节点:

<xsl:value-of select="//xdf:field[@name='A']/xdf:field[@name='0216']/xdf:value"/>

第一个//将从根开始搜索所有元素。在找到等于值后xdf:field,它将完成三个,因为使用.@nameA/

你甚至可以摆脱第一个//

<xsl:value-of select="xdf:xfdf/xdf:fields/xdf:field[@name='A']/xdf:field[@name='0216']/xdf:value"/>

请注意,它不是以 开头的/,因为您已经在模板匹配的根目录上。

于 2013-11-08T11:01:27.647 回答