2010-07-07 126 views
0

我想从以下XMLXSL跳绳子元素

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

上面的代码跳过所有具有姓氏元素的人物元素。

任何人都可以帮我使用这段代码吗?

感谢

回答

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> 

注意:恒等变换。空模板去除节点。

+0

谢谢。工作完美! – Maximus 2010-07-07 15:01:46

+0

@ jason4:你好!另外,为了帮助其他人,请编辑您的问题并明确说明您想剥离“last-name”元素。 – 2010-07-08 13:59:28

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)]正在选择匹配条件not(last-name)的所有person元素,这意味着它匹配任何没有子元素last-name元素的person元素。它的行为完全如实。

+0

请不要推荐以'//开头的表达式,因为它们非常低效。 – 2010-07-07 14:51:27