作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我目前在转换文件时遇到问题。谁能帮助我了解问题所在?
我的源文件是:
<?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>
我不明白为什么这个值是空的...
提前谢谢你,
马克西姆
最佳答案
您的输入 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"
不会将 namespace 输出到您的结果 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"/>
第一个 //
将从根开始搜索所有元素。在找到 @name
等于值 A
的 xdf:field
之后,由于使用 /
,它将完成这三个操作>.
你甚至可以去掉第一个//
:
<xsl:value-of select="xdf:xfdf/xdf:fields/xdf:field[@name='A']/xdf:field[@name='0216']/xdf:value"/>
请注意,它不是以 /
开头的,因为您已经在模板匹配的根上。
关于xml - 使用 XSLT 文件时值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19857187/
我是一名优秀的程序员,十分优秀!