我目前遇到文件转换问题。有谁能帮我理解问题所在?
我的源文件是:
<?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>
我不明白为什么这个值是空的......
提前谢谢你,
马克西姆
答案 0 :(得分: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
@name
等于值A
之后,由于使用了/
,它将完成这三项。
你甚至可以摆脱第一个//
:
<xsl:value-of select="xdf:xfdf/xdf:fields/xdf:field[@name='A']/xdf:field[@name='0216']/xdf:value"/>
请注意,它并非以/
开头,因为您已经在模板匹配的根目录下。