XSLT中的序列

时间:2014-02-19 18:25:55

标签: xml xslt xslt-1.0 sequence

我的xml输入是 -

<?xml version="1.0" encoding="UTF-8"?> 
<foo>  <bar>bar</bar> 
       <bar>bar</bar> 
       <foobar>foobar</foobar> 
       <foobar>foobar</foobar> 
       <foobar>foobar</foobar>
       <bar>bar</bar>
       <bar>bar</bar> 
</foo>

使用xslt的输出应为

 <?xml version="1.0" encoding="UTF-8"?>

 <foo>  
 <s> 
 <s> 
 <bar>bar</bar>  
 <bar>bar</bar>
 </s>
 <s> 
 <foobar>foobar></foobar>
 <foobar>foobar></foobar>
 <foobar>foobar></foobar>
 </s> 
 <s>      
 <bar>bar</bar>  
 <bar>bar</bar> 
 </s>
 </s>
</foo>

输出应该包含父元素内的元素序列。混合的元素序列将在父节点“s”内移动。是否有任何xslt命令检测序列并相应地处理xml。非常感谢。

1 个答案:

答案 0 :(得分:1)

here相同,使用名称不同的前一个兄弟姐妹的ID,以便对记录进行分组:

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

<xsl:key name="adjacentByName" match="foo/*" use="generate-id(preceding-sibling::*[not(name()=name(current()))][1])" />

<xsl:template match="/">
<foo><s>
    <xsl:for-each select="foo/*[generate-id()=generate-id(key('adjacentByName', generate-id(preceding-sibling::*[not(name()=name(current()))][1]))[1])]">
        <s>
            <xsl:for-each select="key('adjacentByName', generate-id(preceding-sibling::*[not(name()=name(current()))][1]))">
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </s>
    </xsl:for-each>
</s></foo>
</xsl:template>

</xsl:stylesheet>

加了:

  

但我得到的输出与我想要的输出不一样......

当应用于您的(已清理)输入时:

<?xml version="1.0" encoding="UTF-8"?> 
<foo>
    <bar>bar</bar> 
    <bar>bar</bar> 
    <foobar>foobar</foobar> 
    <foobar>foobar</foobar> 
    <foobar>foobar</foobar>
    <bar>bar</bar>
    <bar>bar</bar> 
</foo>

结果是:

<?xml version="1.0" encoding="utf-8"?>
<foo>
  <s>
    <s>
      <bar>bar</bar>
      <bar>bar</bar>
    </s>
    <s>
      <foobar>foobar</foobar>
      <foobar>foobar</foobar>
      <foobar>foobar</foobar>
    </s>
    <s>
      <bar>bar</bar>
      <bar>bar</bar>
    </s>
  </s>
</foo>

对我来说,这似乎正是你要求的结果:

<?xml version="1.0" encoding="UTF-8"?>

 <foo>  
 <s> 
 <s> 
 <bar>bar</bar>  
 <bar>bar</bar>
 </s>
 <s> 
 <foobar>foobar></foobar>
 <foobar>foobar></foobar>
 <foobar>foobar></foobar>
 </s> 
 <s>      
 <bar>bar</bar>  
 <bar>bar</bar> 
 </s>
 </s>
</foo>

>元素中的<foobar>字符除外,我已将其从输入中删除。

-

P.S。请在回答完毕后删除您的问题。