我想跳过跟随xml的子元素
<person id="101">
<name>XYZ</name>
<last-name>XXX</last-name>
</person>
<person id="101">
<name>YYY</name>
<last-name>BBB</last-name>
</person>
假设我想跳过姓氏,这是我的代码
<xsl:template match="/">
<xsl:apply-templates select="//person [not(last-name)]" />
</xsl:template>
<xsl:template match="person">
<xsl:copy-of select="." />
<xsl:text>
</xsl:text>
</xsl:template>
上面的代码会跳过具有姓氏元素的所有person元素。
任何人都可以帮我解释这段代码吗?
由于
答案 0 :(得分:1)
通过“跳过姓氏”,我认为你希望你的输出看起来像这样:
<person id="101">
<name>XYZ</name>
</person>
<person id="101">
<name>YYY</name>
</person>
在这种情况下,您的方法必须包含所有person
元素。复制除特定元素之外的所有内容的标准方法如下:
<xsl:template match="/">
<xsl:apply-templates select="//person"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="last-name">
<!-- Do nothing, you don't want to copy this. -->
</xsl:template>
我认为您误解了XPath表达式的工作原理。您的表达式//person [not(last-name)]
正在选择与条件person
匹配的所有not(last-name)
元素,这意味着它匹配任何没有子person
元素的last-name
元素。它的表现完全正确。
答案 1 :(得分:1)
正确输入:
<root>
<person id="101">
<name>XYZ</name>
<last-name>XXX</last-name>
</person>
<person id="101">
<name>YYY</name>
<last-name>BBB</last-name>
</person>
</root>
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="last-name"/>
</xsl:stylesheet>
产生我认为理想的结果:
<root>
<person id="101">
<name>XYZ</name>
</person>
<person id="101">
<name>YYY</name>
</person>
</root>
注意:身份转换。用于剥离节点的空模板。