You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT技术问询:遍历SHELF的for-each循环中如何引用BOOK的TITLE与AUTHOR

解决XSLT遍历SHELF时关联对应BOOK的TITLE和AUTHOR问题

我明白你现在的需求啦——遍历XML里的<SHELF>元素时,要关联到<BOOKS>里对应ID的BOOK的TITLE和AUTHOR信息对吧?这在XSLT里其实很常见,我给你两种可行的方案,其中用索引的方式效率更高哦:

首先先补全你给出的XML完整结构(方便测试):

<DOC>
  <BOOKS>
    <BOOK ID="1234">
      <TITLE>Intro to XSLT</TITLE>
      <AUTHOR>Junior Writer</AUTHOR>
    </BOOK>
    <BOOK ID="1235">
      <TITLE>Advanced XSLT</TITLE>
      <AUTHOR>Senior Writer</AUTHOR>
    </BOOK>
  </BOOKS>
  <CABINET>
    <SHELF>
      <NAME>Top</NAME>
      <BOOK ID="1234"/>
    </SHELF>
    <SHELF>
      <NAME>Bottom</NAME>
      <BOOK ID="1235"/>
    </SHELF>
  </CABINET>
</DOC>

方案一:使用<xsl:key>索引(推荐,效率更高)

这种方式先给所有BOOK元素按ID建立索引,遍历SHELF时直接通过索引查找对应BOOK,适合BOOK数量较多的场景:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 定义索引:以BOOK的ID属性为键,匹配所有BOOK元素 -->
  <xsl:key name="book-by-id" match="BOOK" use="@ID"/>

  <xsl:template match="/">
    <html>
      <body>
        <h2>Books on Each Shelf</h2>
        <!-- 遍历每个SHELF元素 -->
        <xsl:for-each select="DOC/CABINET/SHELF">
          <div>
            <h3>Shelf: <xsl:value-of select="NAME"/></h3>
            <!-- 拿到当前SHELF里BOOK的ID -->
            <xsl:variable name="current-book-id" select="BOOK/@ID"/>
            <!-- 通过索引找到对应ID的完整BOOK节点 -->
            <xsl:variable name="matched-book" select="key('book-by-id', $current-book-id)"/>
            
            <p>Title: <xsl:value-of select="$matched-book/TITLE"/></p>
            <p>Author: <xsl:value-of select="$matched-book/AUTHOR"/></p>
          </div>
          <hr/>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

方案二:直接用XPath匹配(简单场景可用)

如果你的XML里BOOK数量不多,也可以直接在遍历SHELF时用XPath定位对应BOOK,不用额外定义索引:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2>Books on Each Shelf</h2>
        <xsl:for-each select="DOC/CABINET/SHELF">
          <div>
            <h3>Shelf: <xsl:value-of select="NAME"/></h3>
            <!-- 直接通过ID匹配找到对应BOOK的TITLE和AUTHOR -->
            <p>Title: <xsl:value-of select="/DOC/BOOKS/BOOK[@ID = current()/BOOK/@ID]/TITLE"/></p>
            <p>Author: <xsl:value-of select="/DOC/BOOKS/BOOK[@ID = current()/BOOK/@ID]/AUTHOR"/></p>
          </div>
          <hr/>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

两种方案最终都会输出每个书架对应的书籍标题和作者信息,你可以根据自己的XML规模选择合适的方式~

内容的提问来源于stack exchange,提问作者Brian Arthur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:30:26