【问题标题】:XSLT: xsl:sort produces undesired newlinesXSLT: xsl:sort 产生不需要的换行符
【发布时间】:2014-02-12 11:14:03
【问题描述】:

任务看起来很简单:按属性“id”的值对输入文档中的所有元素进行(本地)排序;否则内容应保持不变。

输入 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 引入了相同的换行符以及额外的格式错误。

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

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    使用&lt;xsl:strip-space elements="*"/&gt; 作为顶级元素。在这种情况下,* 是表示所有元素的通配符。相反,您可以列出您想要去除其空白的特定元素。

    样式表

    <?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>
    

    【讨论】:

    • 太棒了!感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2017-04-15
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多