xslt2.0使用应用模板进行排序不起作用

时间:2015-04-23 15:10:22

标签: xml xslt xslt-2.0 xsl-stylesheet

我在这里看到了几个关于如何使用xslt 2.0对xml的一部分进行排序(重新排序)的示例 但是我似乎无法让它发挥作用。

示例输入文件:

<example>
<field1>1</field1>
<field2>2</field2>
<fileheader>
    <headerfield1>1</headerfield1>
    <headerfield2>2</headerfield2>
    <headerfield3>3</headerfield3>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>50</value>
            </bespokehook>
        </file>
    </consol>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>20</value>
            </bespokehook>
        </file>
    </consol>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>40</value>
            </bespokehook>
        </file>
    </consol>
</fileheader>

我想要的是根据

中的值重新排序完整的consol细分
                <bespokehook>
                <code>code</code>
                <value>20</value>
            </bespokehook>

我似乎无法正常工作。 我在本网站和其他网站上使用了几个例子但没有成功。

有人可以告诉我如何实现这个

TNX

1 个答案:

答案 0 :(得分:0)

样式表

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs">

<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="fileheader">
  <xsl:copy>
    <xsl:apply-templates select="* except consol"/>
    <xsl:apply-templates select="consol">
      <xsl:sort select="xs:decimal(file/bespokehook/value)"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

转换输入

<example>
<field1>1</field1>
<field2>2</field2>
<fileheader>
    <headerfield1>1</headerfield1>
    <headerfield2>2</headerfield2>
    <headerfield3>3</headerfield3>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>50</value>
            </bespokehook>
        </file>
    </consol>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>20</value>
            </bespokehook>
        </file>
    </consol>
    <consol>
        <consolfield1>1</consolfield1>
        <consolfield2>2</consolfield2>
        <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
                <code>code</code>
                <value>40</value>
            </bespokehook>
        </file>
    </consol>
</fileheader>
</example>

进入结果

<example>
   <field1>1</field1>
   <field2>2</field2>
   <fileheader>
      <headerfield1>1</headerfield1>
      <headerfield2>2</headerfield2>
      <headerfield3>3</headerfield3>
      <consol>
         <consolfield1>1</consolfield1>
         <consolfield2>2</consolfield2>
         <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
               <code>code</code>
               <value>20</value>
            </bespokehook>
         </file>
      </consol>
      <consol>
         <consolfield1>1</consolfield1>
         <consolfield2>2</consolfield2>
         <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
               <code>code</code>
               <value>40</value>
            </bespokehook>
         </file>
      </consol>
      <consol>
         <consolfield1>1</consolfield1>
         <consolfield2>2</consolfield2>
         <file>
            <filefield1>1</filefield1>
            <filefield2>2</filefield2>
            <filefield3>3</filefield3>
            <filefield4>4</filefield4>
            <bespokehook>
               <code>code</code>
               <value>50</value>
            </bespokehook>
         </file>
      </consol>
   </fileheader>
</example>