XSLT技术问询:遍历SHELF的for-each循环中如何引用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
相关产品推荐
相关产品推荐

