如何基于属性的XSL for-each?

时间:2017-06-14 17:04:22

标签: xml xslt attributes transformation

我需要获得所有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存在,但如何?

如果你用简单的英语知道一个好的来源,我愿意学习。

2 个答案:

答案 0 :(得分:2)

你使用的基本上只有一个let val = parseFloat(inputString.value.replace(")", "").substring(4, 20)); output.innerHTML = Math.log(val); 太少了。有多个for-each es,所以你需要迭代这些。

VERS

但是,如果正确使用XPath,这些都可以折叠成一个<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>

以下是如何迭代具有for-each属性的所有VERS es:

vnumber

旁注:我认为你应该研究如何在XSLT中使用模板。假设您确实想要对LIB,BOOK和CHAPTER执行某些操作,那么模板就是这样做的方式,而不是像上面第一个示例中那样具有深度嵌套的金字塔。

答案 1 :(得分:0)

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

尝试改为:

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

您没有发布预期结果,因此我不确定您希望如何分隔返回的值。