XSLT根据CustomTagAttribs类型定位元素

时间:2010-12-09 20:06:14

标签: xml xslt

我有一个XML文档,显示了这一点:

<Element>
  <Content>

    <CustomTagAttribs>
      <type>breadcrumb</type>
    </CustomTagAttribs>

    <ElementData>
      <LBarItem>TEXT!</LBarItem>
    </ElementData>

  </Content>
<Element>

还有另一个<Element>实例,就像上面那个,但没有<type>breadcrumb</type>。我想仅在具有面包屑类型的<Element>中定位LBarItems。我该怎么做?

这就是我一直在尝试的:

<xsl:for-each select="//Content/ElementData/LBarItem">
  <xsl:if test="../type='breadcrumb'">
    <xsl:value-of select="Title"/>
  </xsl:if>
</xsl:for-each>

任何帮助?

2 个答案:

答案 0 :(得分:2)

你为什么不用:

/Element/Content[CustomTagAttribs/type = 'breadcrumb']/ElementData/LBarItem

答案 1 :(得分:1)

您根本不需要使用<xsl:for-each>和任何条件逻辑。

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="Content[CustomTagAttribs/type='breadcrumb']/*/LBarItem">
      <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

应用于此XML文档(包含两个Element元素):

<t>
    <Element>
        <Content>
            <CustomTagAttribs>
                <type>breadcrumb</type>
            </CustomTagAttribs>
            <ElementData>
                <LBarItem>I have "breadcrumb" type</LBarItem>
            </ElementData>
        </Content>
    </Element>
    <Element>
        <Content>
            <CustomTagAttribs>
                <type>something else</type>
            </CustomTagAttribs>
            <ElementData>
                <LBarItem>I have "something else" type</LBarItem>
            </ElementData>
        </Content>
    </Element>
</t>

生成想要的正确结果

<LBarItem>I have "breadcrumb" type</LBarItem>