xslt,如何根据另一个相同级别标签的内容选择标签

时间:2010-09-27 16:11:50

标签: xslt

我的源文件如下所示:

<stuff> 
<s>
    <contents>
      <code>503886</code>
      <code>602806</code>
    </contents>
    ...
</s>
<p>
    <code>344196</code>
    <export>true</export>
    ...
</p>
<!-- more 's' and 'p' tags -->
...
</stuff>

我需要迭代's'并选择那些 - 其中'contents'标签内部的'code'属于'p',其中export = true。

过去几个小时我一直试图解决这个问题。 请分享一些想法。

2 个答案:

答案 0 :(得分:1)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kSByCode" match="s" use="contents/code"/>
    <xsl:template match="text()"/>
    <xsl:template match="p[export='true']">
        <xsl:copy-of select="key('kSByCode',code)"/>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<stuff>
    <s>
        <contents>
            <code>503886</code>
            <code>602806</code>
        </contents>
    </s>
    <p>
        <code>602806</code>
        <export>true</export>
    </p>
</stuff>

输出:

<s>
    <contents>
        <code>503886</code>
        <code>602806</code>
    </contents>
</s>

注意:每当有交叉引用时,请使用密钥。

修改:错过迭代s部分。谢谢,迪米特!

编辑2 :重新阅读此答案我发现它可能令人困惑。因此,对于表达式选择节点,请使用:

key('kSByCode',/stuff/p[export='true']/code)

答案 1 :(得分:0)

  

我需要迭代's'并选择   那些 - 在'内容'标签内   有'代码'属于'p'   具有export = true。

使用

<xsl:apply-templates select=
 "/*/s
      [code
      =
       /*/p
          [export='true']
                      /code]"/>