XSLT嵌套选择

时间:2014-01-20 19:54:48

标签: xml xslt xpath

我对xslt相对较新我需要根据当前帖子的pid使用哪个帖子选择评论元素

部分XSLT我遇到问题

<xsl:for-each select="posts/post">
    <div class="post">
        <h3><xsl:value-of select="ptitle"/></h3>
        <span><xsl:value-of select="ptext"/></span>
        <xsl:variable name="pid" select="@pid" />
        <!-- Here i need to select the comment according to the pid -->
    </div>
    <br />
</xsl:for-each>

XML代码

    <posts>
         <post pid="p2">
            <ptitle>APPLICATIONS OF THE FUTURE</ptitle>
            <pfeatureimage>aig.jpg</pfeatureimage>
            <ptext xml:lang="en">just text </ptext>
            <pdate>25062013</pdate>
            <pimg>future.jpg</pimg>
            <pimg>future.jpg</pimg>
            <pimg>future.jpg</pimg>
            <pauthorid>a3</pauthorid>
        </post>
    </posts>

    <comments>
        <comment cid="c1">
            <pid>p2</pid>
            <uid>u2</uid>
            <ctext>other t</ctext>
            <likes>5</likes>
            <dislikes>1</dislikes>
        </comment>
                <comment cid="c2">
            <pid>p3</pid>
            <uid>u2</uid>
            <ctext>bogsg</ctext>
            <likes>5</likes>
            <dislikes>1</dislikes>
        </comment>
  </comments>

2 个答案:

答案 0 :(得分:3)

在XSLT中处理任何交叉引用问题的方法是使用key。您将键定义放在样式表的顶层(在任何模板之外):

<xsl:key name="commentsByPid" match="comment" use="pid" />

match表达式确定要查看的节点,use是相对于每个匹配节点计算的路径,以确定键值(因此在这种情况下,它将采用字符串每个匹配的pid内的comment元素的值。

使用此键定义,您可以使用pid函数有效地查找与当前帖子的key属性匹配的所有评论:

<xsl:for-each select="posts/post">
    <div class="post">
        <h3><xsl:value-of select="ptitle"/></h3>
        <span><xsl:value-of select="ptext"/></span>
        <xsl:for-each select="key('commentsByPid', @pid)">
            <!-- do whatever you need with the <comment> here -->
        </xsl:for-each>
    </div>
    <br />
</xsl:for-each>

答案 1 :(得分:0)

对于单个评论,请替换您的变量定义

<xsl:variable name="pid" select="@pid" />

通过

<xsl:value-of select="//comments/comment[pid=current()/@pid]/ctext" />

如果您有多条评论,可以尝试

<xsl:variable name="pid" select="@pid" />
<xsl:for-each select="//comments/comment[pid=$pid]">
    <xsl:value-of select="ctext" />
</xsl:for-each>