【问题标题】:Match all nodes that contain a child node with specific contents匹配包含具有特定内容的子节点的所有节点
【发布时间】:2012-03-08 20:19:09
【问题描述】:

假设我有这个 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。有人知道答案了吗?

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

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

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

    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>
    

    如果您确实需要更改 &lt;BB&gt;,请添加其他模板以覆盖身份转换。

    【讨论】:

    • 谢谢。 BB[CC='True'] 语法是我正在寻找的。我需要做的比最初的问题建议的更多,只是这一块主要是让我挂了。感谢您提供明确的答案和良好的示例输入/输出。
    猜你喜欢
    • 2017-12-07
    • 2014-10-02
    • 1970-01-01
    • 2020-08-28
    • 2015-05-08
    • 2012-06-05
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多