如何基于属性对每个进行 XSL?

How to XSL for-each based on an attribute?

我需要从以下位置获取所有 VERS(0 和 1):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<LIB xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
  <BOOK bnumber="1">
    <CHAPTER cnumber="1">
      <VERS vnumber="1">0</VERS>
      <VERS vnumber="2">1</VERS>
    </CHAPTER>
  </BOOK>
</LIB>

tried 使用此 XSL 模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="LIB">
<xsl:for-each select="BOOK">
<xsl:for-each select="CHAPTER"> 
<xsl:value-of select="VERS"/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

但是只拿到了第一个VERS(0)

我怎么会for-each?基于 vnumber 存在,但如何?

如果你知道一个很好的英文来源,我愿意学习。

在 XSLT 1.0 中,xsl:value-of 指令 returns 所选节点集中仅 第一个 节点的字符串值。

试试这样的东西:

<xsl:template match="/">
    <xsl:for-each select="LIB/BOOK/CHAPTER/VERS">
        <xsl:value-of select="." />
    </xsl:for-each>
</xsl:template>

你没有post你预期的结果,所以我不确定你想如何分隔返回值。

基本上,您使用的 for-each 太少了。有多个 VERS,因此您需要迭代这些。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="LIB">
      <xsl:for-each select="BOOK">
        <xsl:for-each select="CHAPTER">
          <xsl:for-each select="VERS[@vnumber]">
            <xsl:value-of select="."/>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

但是,如果您正确使用 XPath,这些都可以合并为一个for-each

以下是如何遍历所有具有 vnumber 属性的 VERSes:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="LIB/BOOK/CHAPTER/VERS[@vnumber]">
      <xsl:value-of select="." />
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

旁注:我认为您应该研究一下如何在 XSLT 中使用模板。假设您确实想对 LIB、BOOK 和 CHAPTERS 做一些事情,模板是执行此操作的方法,而不是像上面的第一个示例那样具有深层嵌套的金字塔。