子节点问题的XSLT值

时间:2018-03-28 05:42:19

标签: xml xslt

我有一个xml文件,其中包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<q>sdfsdf</q>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
</catalog>

我有两个XSL文件 XSL#1:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="catalog/cd/title"/>
</xsl:template>
</xsl:stylesheet>

和XSL#2:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//cd">
<xsl:value-of select="title"/>
</xsl:template>
</xsl:stylesheet>

当我使用XSL#1时,结果是:“Empire Burlesque”,但当我使用XSL#2时,结果是:“sdfsdf Empire Burlesque”。为什么XSL#2会返回这样的值?当父节点“cd”匹配时,是否有可能获得子节点“title”的值?

1 个答案:

答案 0 :(得分:1)

当您阅读 XSLT 脚本时,仅仅阅读已写入的内容是不够的。

您还必须知道编写 not 的内容,但XSLT处理器 仍假定为默认设置。

在这种特殊情况下,你可能忘了(或者直到现在都不知道) 元素和整个文档的默认模板是:

<xsl:template match="* | /">
  <xsl:apply-templates/>
</xsl:template>

,文本和属性节点的默认模板(略微简化)是:

<xsl:template match="text() | @*">
  <xsl:value-of select="string(.)"/>
</xsl:template>

所以,例如q元素(及其内容)仅由这些模板处理, 再现文本内容并忽略标记(XML标记)。

如果你不想要这个,请添加例如匹配q元素的空模板

<xsl:template match="q"/>

并且额外的 sdfsdf 将从输出中消失。

实际上,你可以为文本节点添加一个空模板

<xsl:template match="text()"/>

to&#34;抑制&#34;您的模板无法明确提供的所有元素的文本内容。