3

我有以下 XML 代码

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="new_proto.xsl"?>
<Return>
 <SDSSJ type="form" />
 <JSFK type="form" />
 <KJFK type="form2" />
 <HJDHH type="form"> New Val </HJDHH>
 <NNDJB type="some"> 
    <DJSJJ type="form">
       THIS
    </DJSJJ>
    <KAKKK type="nope">
    DONT
    </KAKKK>
 Not
</NNDJB>
</Return>

我只想获取具有属性 type='form' 的所有节点的名称。所以我尝试了以下 XSL。

  1 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2    <xsl:output method="html" omit-xml-declaration="yes" indent="no"/>
  3       <xsl:template match="//*[@type='form']">
  4       <xsl:value-of select="name()" />
  5       </xsl:template>
  6 </xsl:stylesheet>

但不是SDSSJ JSFK HJDHH DJSJJ,我得到SDSSJ JSFK HJDHH DJSJJ DONT Not。为什么不符合模板的子元素仍然出现?我应该怎么做才能摆脱它们?

4

1 回答 1

7

添加此模板:

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

例子:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" indent="no"/>

    <xsl:template match="//*[@type='form']">
        <xsl:value-of select="name()"/>
    </xsl:template>

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

</xsl:stylesheet>

默认情况下,文本被传递到输出。上面的模板将去除不匹配的文本。

以下是规范对默认 XSLT 模板规则的说明:

有一个内置的模板规则允许递归处理在样式表中的显式模板规则没有成功模式匹配的情况下继续进行。此模板规则适用于元素节点和根节点。下面显示了内置模板规则的等效项:

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

每种模式还有一个内置的模板规则,它允许递归处理在样式表中的显式模板规则没有成功模式匹配的情况下以相同的模式继续。此模板规则适用于元素节点和根节点。下面显示了模式 m 的内置模板规则的等效项。

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

还有一个用于复制文本的文本和属性节点的内置模板规则:

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

处理指令和注释的内置模板规则是什么都不做。

<xsl:template match="processing-instruction()|comment()"/>

命名空间节点的内置模板规则也是什么都不做。没有可以匹配命名空间节点的模式;因此,内置模板规则是唯一适用于命名空间节点的模板规则。

内置模板规则被视为在样式表之前隐式导入,因此其导入优先级低于所有其他模板规则。因此,作者可以通过包含显式模板规则来覆盖内置模板规则。

于 2012-10-24T23:02:48.410 回答