XSLT会抑制除1之外的所有节点

时间:2014-04-24 15:23:50

标签: xml xslt xpath

说我有一个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 = '*'的空模板根本不会抑制任何输出?
我是否需要在该空白模板中的某个表达式中使用输出?

实现这一目标的一般方法是什么?

2 个答案:

答案 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()"/>