Xml 不匹配的子元素也出现在XSL模板下
我有以下XML代码Xml 不匹配的子元素也出现在XSL模板下,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有以下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>
<?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>
1
2.
3.
4.
5.
6.
但是我得到的不是SDSSJ-JSFK-HJDHH-DJSJJ
,而是SDSSJ-JSFK-HJDHH-DJSJJ-Not
。为什么不符合模板的子元素仍然出现?我该怎么做才能摆脱它们 添加此模板:
<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()"/>
命名空间节点的内置模板规则也是什么都不做。
没有可以匹配命名空间节点的模式;所以,内置的
模板规则是应用于命名空间的唯一模板规则
节点
内置模板规则被视为已导入
隐式位于样式表之前,因此具有较低的导入优先级
而不是所有其他模板规则。因此,作者可以重写
内置模板规则,包括显式模板规则
我对XSLT一无所知。你能告诉我应该在哪里添加这个吗?@Pradep-我添加了一个示例。@Pradep-另外,你可以从
//*[@type='form']
中删除/
。如果需要分隔值,您可能还需要在xsl:value of
(使用concat()
或xsl:text
)后面添加空格。这很有效!但是你能告诉我添加一个额外的模板是如何解决这个问题的吗?@Matt-你需要阻止处理其他所有内容。因此,对于OP尝试执行的操作,您可以添加一个匹配/
的模板,然后执行xsl:apply templates
选择//*[@type='form']
。这样,只有那些元素才会被处理。