XSL跳过子元素

时间:2010-07-07 14:09:32

标签: xslt

我想跳过跟随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>&#xa;</xsl:text>
</xsl:template>

上面的代码会跳过具有姓氏元素的所有person元素。

任何人都可以帮我解释这段代码吗?

由于

2 个答案:

答案 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>

注意:身份转换。用于剥离节点的空模板。