Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 不匹配的子元素也出现在XSL模板下_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 不匹配的子元素也出现在XSL模板下

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代码

<?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']
。这样,只有那些元素才会被处理。