XSLT:xsl:sort产生不需要的换行符

时间:2014-02-12 11:14:04

标签: xml xslt xslt-1.0

任务看起来很简单:按输入文件的值排序(本地)输入文档中的所有元素' id&#39 ;;否则内容应保持不变。

输入XML

<?xml version="1.0" encoding="utf-8"?>
<A>
  <Group>
    <Item id="c"/>
    <Item id="a"/>
    <Item id="b"/>
  </Group>
  <Group>
    <Item id="f"/>
    <Item id="d"/>
  </Group>
</A>

所需的输出

<?xml version="1.0" encoding="utf-8"?>
<A>
  <Group>
    <Item id="a"/>
    <Item id="b"/>
    <Item id="c"/>
  </Group>
  <Group>
    <Item id="d"/>
    <Item id="f"/>
  </Group>
</A>

请注意,排序是每个Group项的本地排序。这应该是非常简单的:

XSLT

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

    <xsl:output method="xml" encoding="utf-8" indent="yes" />

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

</xsl:transform>

实际输出

<?xml version="1.0" encoding="utf-8"?>
<A>
    <Group>



        <Item id="a"/>
        <Item id="b"/>
        <Item id="c"/>
    </Group>
    <Group>


        <Item id="d"/>
        <Item id="f"/>
    </Group>
</A>

问题是不受欢迎的换行。我用Saxon6.5.5,Saxon-PE 9.4.0.4,Saxon-HE 9.4.0.4,Saxon-EE 9.4.0.4获得了这个结果。 Xalan引入了相同的换行符以及额外的格式化。

我一直盯着自己,所以我很感激任何建议。

1 个答案:

答案 0 :(得分:1)

使用<xsl:strip-space elements="*"/>作为顶级元素。在这种情况下,*是表示所有元素的通配符。相反,你可以列出你想要删除空格的特定元素。

<强> Stlysheet

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

    <xsl:output method="xml" encoding="utf-8" indent="yes" />
    <xsl:strip-space elements="*"/>

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

</xsl:transform>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<A>
   <Group>
      <Item id="a"/>
      <Item id="b"/>
      <Item id="c"/>
   </Group>
   <Group>
      <Item id="d"/>
      <Item id="f"/>
   </Group>
</A>