我正在尝试使用XSLT将XML转换为HTML。在这个区域,我需要读取重复的节点值。
考虑这种情况
<root>
<test>
<ID> 123 <</ID>
<Name> MyName </Name>
<Country> India </Country>
<Books>
<language> C </language>
<language> C++ </language>
<language> Java </language>
<language> XML </language>
</Books>
</root>
在此示例中,我能够读取所有节点值,如
<xsl:value-of select="ID">
除“语言”节点外。 我需要输出像C C ++ Java XML。 任何想法????
答案 0 :(得分:2)
使用:
string(/*/*/Books)
此XPath表达式求值为第一个(在您的情况下只有一个)Books
元素的 string value ,该元素是任何子元素的子元素XML文档的顶部元素。
根据定义,元素的 string value 是其所有文本节点后代的连接(按文档顺序)。
完整代码:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:value-of select="string(/*/*/Books)"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于所提供的(但已更正为格式良好的!!!)XML文档:
<root>
<test>
<ID> 123 </ID>
<Name> MyName </Name>
<Country> India </Country>
<Books>
<language> C </language>
<language> C++ </language>
<language> Java </language>
<language> XML </language>
</Books>
</test>
</root>
评估XPath表达式并输出结果:
C C++ Java XML
答案 1 :(得分:0)
<xsl:for-each select="Books/language">
<xsl:value-of select "." />
<xsl:text> </xsl:text>
</xsl:for-each>
答案 2 :(得分:0)
这里有一些指示,但实际上,我强烈建议你花几个小时来完成一个像http://www.w3schools.com/xsl/
这样的体面教程。首先,Dimitrie指出你的XML格式不正确。我有点惊讶你的XSLT解析器没有对此感到不安。你有一个开放的测试标签,永远不会关闭,额外的&lt;在您的结束标识中。此外,您的表达式值未正确关闭
其次,你说“在这个例子中我能够读取所有的节点值...”这种没有看到你的其余代码是没有意义的,我猜它看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/root">
<xsl:value-of select="ID"/>
</xsl:template>
</xsl:stylesheet>
如果您能够编写XSLT,了解xsl:template匹配位意味着什么是至关重要的。 XSLT通过您的文档逐个应用规则,您可以将输入文档转换为输出文档。
在每个阶段,您都需要知道它在文档中的位置。这被称为“背景”。在上面的代码中,规则在到达/ root时应用。这意味着尖括号中的东西称为根,在尖括号中没有封闭的东西。
鉴于此上下文,XSLT表达式与它相关。它有点像DOS目录路径。除非您知道当前目录,否则相对文件路径并不重要。
因此,在您的示例中,select =“ID”表示ID标记的值,该标记是当前上下文的子项,即/ root / ID。
你的问题是如何使用语言元素。好吧,如果引擎的上下文是/ root,那么你需要下载到书籍然后再下来到语言,所以表达式将是ID / books / language
虽然你很想学习XSLT。它并不是那么难,它是处理XML的非常强大的语言。