XSLT 2.0使用for-each-group

时间:2015-10-28 16:03:49

标签: xml xslt xslt-2.0

我正在尝试将一个非常混乱的xml的一部分转换为更具可读性的部分,但是当我的代码没有生成我想要的内容时。

我可以获得一些关于我的代码有什么问题的反馈,以及我如何解决它?

示例输入:

<root>
 <body>
   <para>
    <heading> name </heading>
   </para>
   <para> This is the name </para>
   <para>
    <heading> Usage </heading>
   </para>
   <para> This is the usage </para>
 </body>
<root>

我想看到的输出是:

<root>
 <conbody>
  <section>
   <title> Name </title>
   <p> This is the name </p>
  </section>
  <section>
   <title> Usage </title>
   <p> This is the usage </p>
 <conbody>
<root>

我的代码目前看起来像这样:

<xsl:template match="body">
    <conbody>
        <xsl:for-each-group select="para" group-starting-with="para[heading]">
            <section>
                <title>
                    <xsl:apply-templates select="element()"/>
                </title>
                <p>
                    <xsl:apply-templates select="*"/>
                </p>
            </section>
        </xsl:for-each-group>
    </conbody>
</xsl:template>

内容未正确复制,我不确定原因?

1 个答案:

答案 0 :(得分:2)

这是因为您需要将模板应用于current-group()

您可以尝试在第一个current-group()[1]中使用xsl:apply-templates,在第二个current-group()[not(position()=1)]中使用xsl:apply-templates;这应该让你接近。

以下是创建titlep元素的略有不同方法的示例...

XML输入

<root>
    <body>
        <para>
            <heading> name </heading>
        </para>
        <para> This is the name </para>
        <para>
            <heading> Usage </heading>
        </para>
        <para> This is the usage </para>
    </body>
</root>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template> 

  <xsl:template match="body">
    <conbody>
      <xsl:for-each-group select="para" group-starting-with="para[heading]">
        <section>
          <xsl:apply-templates select="current-group()"/>
        </section>
      </xsl:for-each-group>
    </conbody>
  </xsl:template>

  <xsl:template match="para">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="para/text()">
    <p><xsl:value-of select="."/></p>
  </xsl:template>

  <xsl:template match="heading">
    <title><xsl:apply-templates/></title>
  </xsl:template>

</xsl:stylesheet>

XML输出

<root>
   <conbody>
      <section>
         <title> name </title>
         <p> This is the name </p>
      </section>
      <section>
         <title> Usage </title>
         <p> This is the usage </p>
      </section>
   </conbody>
</root>