如何基于属性对每个进行 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
属性的 VERS
es:
<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 做一些事情,模板是执行此操作的方法,而不是像上面的第一个示例那样具有深层嵌套的金字塔。
我需要从以下位置获取所有 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
属性的 VERS
es:
<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 做一些事情,模板是执行此操作的方法,而不是像上面的第一个示例那样具有深层嵌套的金字塔。