Xslt 跳过子元素

Xslt 跳过子元素,xslt,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> X

我想从以下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>

XYZ
XXX
YYY
BBB
假设我想跳过姓氏,这是我的代码

<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>
上面的代码跳过具有姓氏元素的all-person元素

有人能帮我写这段代码吗

谢谢“跳过姓氏”我想您希望您的输出如下所示:

<person id="101">
  <name>XYZ</name>
</person>
<person id="101">
  <name>YYY</name>
</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)]
正在选择与条件
not(last name)
匹配的所有
person
元素,这意味着它匹配没有子
last name
元素的任何
person
元素。它的行为与应有的完全一致。

输入正确:

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

XYZ
XXX
YYY
BBB
此样式表:

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

XYZ
YYY

注意:身份转换。空模板以剥离节点。

请不要推荐以
/
开头的表达式,因为它们效率很低。@jason4:你很好!此外,为了帮助其他人,请编辑您的问题,并明确表示您要删除
姓氏
元素。