我有一个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”的值?
答案 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;您的模板无法明确提供的所有元素的文本内容。