XSLT,如何获取和输出组合元素

时间:2011-04-22 17:41:34

标签: xml xslt

亲爱的社区, 如果你能就如何改变这个问题给我一个建议,那就太棒了:

<div>  
something  
   <title>   this title  </title>  
    something else  
</div>  

<div>  
<title1>
something  </title1>  
<title2>  this title  </title2>  
<title3>  something else  </title>
</div>

不幸的是,由于div中存在内部元素,因此无法使用substring-before / after方法。此外,copy-of似乎也不适用于子串。您对如何转换上述xml有任何建议吗?

3 个答案:

答案 0 :(得分:3)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="div/text()|div/*">
        <xsl:element name="title{position()}">
            <xsl:value-of select="normalize-space(self::text())"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出:

<div>
    <title1>something</title1>
    <title2> this title </title2>
    <title3>something else</title3>
</div>

答案 1 :(得分:1)

此解决方案同时更精确,更通用

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/node()">
  <xsl:element name="title{position()}">
   <xsl:copy-of select="translate(self::text()|node(), '&#xA;&#xD;', '  ')"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<div>
something      
    <title>   this title  </title>
     something else
</div>

更接近所需的结果(只有NL或CR字符转换为空格):

<div>
   <title1> something           </title1>
   <title2>   this title  </title2>
   <title3>      something else </title3>
</div>

答案 2 :(得分:0)

修改

我刚刚意识到我的输出与你的输出不符。
但是@ Alejandro的解决方案是完美的,所以我希望你不会对这个问题感到沮丧。


我提出了这个解决方案:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <xsl:element name="div">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="div/text()|div/title/text()">
        <xsl:element name="title{position()}">
            <xsl:copy-of select="normalize-space(.)" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

产生这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<div>
    <title1>something</title1>
    <title1>this title</title1>
    <title3>something else</title3>
</div>