读取XSLT中的重复节点值

时间:2012-01-24 13:25:27

标签: xml xslt

我正在尝试使用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。 任何想法????

3 个答案:

答案 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的非常强大的语言。