说我有一个xml文档。我想要抑制除一个节点之外的所有节点的输出(这里是节点的节点name
)。
<xsl:template match="/">
<html>
<body>
<h2>Heading</h2>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="group">
<h3>Group</h3>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*">
<!-- No output for all -->
</xsl:template>
<xsl:template match="name">
<div class="block">
Name: <xsl:value-of select="concat(@first, ' ', @middle, ' ', @last)" />
</xsl:template>
这是我的示例XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="visualization.xsl"?>
<group>
<student>
<name first="Some" last="One" middle="_"></name>
<dob>
<date>30</date>
<month>Feb</month>
<year>1987</year>
</dob>
<nationality>NoMansLand'ian</nationality>
<gender>male</gender>
</student>
</group>
但是这样它会打印节点内的值。所以我得到30 Feb 1987 NoMansLand'ian male
的输出。
为什么mach = '*'
的空模板根本不会抑制任何输出?
我是否需要在该空白模板中的某个表达式中使用输出?
实现这一目标的一般方法是什么?
答案 0 :(得分:0)
<xsl:template match="*">
正在捕捉元素,并且没有特定的模板匹配(例如性别,dob,国籍),并且正在对其text
子节点应用默认处理。
添加一个模板来捕获和过滤这些不处理文本子元素的元素:
<xsl:template match="dob | nationality | gender"/>
另一种方法是,给定xml的结构将确保处理和过滤student
个子节点,但只处理我们想要的节点:
<xsl:template match="student/*"/> <!-- do nothing -->
<xsl:template match="student/name">
<xsl:apply-templates/> <!-- do something -->
</xsl:template>
答案 1 :(得分:0)
像deanosaur所说,这是因为text()节点的默认处理(见http://www.w3.org/TR/xslt#built-in-rule)。
尝试将match="*"
替换为match="text()"
...
<xsl:template match="text()"/>