匹配包含具有特定内容的子节点的所有节点

时间:2012-03-08 20:19:09

标签: xml xslt xpath

假设我有这个XML文档,其中......只表示其他杂项节点:

<AA>
    <BB>
        <CC>True</CC>
        ...
    </BB>

    <BB>
        <CC>True</CC>
        ...
    </BB>

    <BB>
        <CC>False</CC>
        ...
    </BB>

    <BB>
        <CC>True</CC>
        ...
    </BB>


    <BB>
        <CC>False</CC>
        ...
    </BB>
</AA>

我正在尝试制作一些模板,例如:

<xsl:template match="/">

<DD>
    <xsl:apply-templates select="/AA/YYY" />
</DD>

<EE>
    <xsl:apply-templates select="/AA/XXX" />
</EE>

</xsl:template>

<xsl:template match="YYY">
 <!-- do stuff -->
</xsl:template>

<xsl:template match="XXX">
   <!-- do stuff -->
</xsl:template>

产生类似于此的输出:

<AA>
    <DD>
        <BB>
            <CC>True</CC>
        </BB>
        <BB>
            <CC>True</CC>
            ...
        </BB>

        <BB>
            <CC>True</CC>
            ...
        </BB>
    </DD>

    <EE>
        <BB>
            <CC>False</CC>
            ...
        </BB>

        <BB>
            <CC>False</CC>
            ...
        </BB>
    </EE>
</AA>

我正在努力寻找放置在匹配属性中的xpath,我目前放置XXX和YYY。有人得到了答案吗?

基本上我想选择具有包含特定内容的子节点的所有节点。

1 个答案:

答案 0 :(得分:1)

如果您使用身份转换,如果您不打算更改<BB>元素中的任何内容,则不需要任何其他模板。

XML输入

<AA>
  <BB>
    <CC>True</CC>
    ...
  </BB>

  <BB>
    <CC>True</CC>
    ...
  </BB>

  <BB>
    <CC>False</CC>
    ...
  </BB>

  <BB>
    <CC>True</CC>
    ...
  </BB>


  <BB>
    <CC>False</CC>
    ...
  </BB>
</AA>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/AA">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <DD>
        <xsl:apply-templates select="BB[CC='True']"/>
      </DD>
      <EE>
        <xsl:apply-templates select="BB[CC='False']"/>
      </EE>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XML输出

<AA>
  <DD>
    <BB>
      <CC>True</CC>
      ...
    </BB>
    <BB>
      <CC>True</CC>
      ...
    </BB>
    <BB>
      <CC>True</CC>
      ...
    </BB>
  </DD>
  <EE>
    <BB>
      <CC>False</CC>
      ...
    </BB>
    <BB>
      <CC>False</CC>
      ...
    </BB>
  </EE>
</AA>

如果您确实需要更改<BB>添加其他模板以覆盖身份转换。