【问题标题】:Sorting XML data based on number of characters in data根据数据中的字符数对 XML 数据进行排序
【发布时间】:2013-03-03 07:27:06
【问题描述】:

我必须根据数据中的字符数对 XML 输出进行排序。到目前为止,我还无法在 XSLT 1.0 中弄清楚它。这是我正在使用的:

源 XML 文件:

<ROOT>
<REPLIST>
    <NAME>ABCDE.xml</NAME>
    <NAME>ABCDEFGH.xml</NAME>
    <NAME>ABC.xml</NAME>
    <NAME>ABCDEFG.xml</NAME>
    <NAME>ABCD.xml</NAME>
    <NAME>ABCDEF.xml</NAME>
    <NAME>JKLMNOPQRST.xml</NAME>
    <NAME>JKLMNOPQRS.xml</NAME>
    <NAME>JKLMNOPQ.xml</NAME>
    <NAME>JKLMN.xml</NAME>
</REPLIST>
<DATALIST>
    <ExtractedName>ABCDEFGH.xml</ExtractedName>
    <ExtractedName>JKLMN.xml</ExtractedName>
    <ExtractedName>ABCDEFG.xml</ExtractedName>
    <ExtractedName>ABCD.xml</ExtractedName>
    <ExtractedName>JKLMNOPQRST.xml</ExtractedName>
    <ExtractedName>ABCDEFG.xml</ExtractedName>
</DATALIST>
</ROOT>

输出

<TestData>
<FormName>ABCDEFGH</FormName>
<FormName>ABCDEFG</FormName>
<FormName>ABCD</FormName>
<FormName>JKLMNOPQRST</FormName>
<FormName>JKLMN</FormName>
</TestData>

期望的输出:

<TestData>
<FormName>JKLMNOPQRST</FormName>
<FormName>ABCDEFGH</FormName>
<FormName>ABCDEFG</FormName>
<FormName>JKLMN</FormName>
<FormName>ABCD</FormName>
</TestData>

样式表(1.0):

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:output method="xml" omit-xml-declaration="yes" standalone="no"/>
<xsl:template match="/">
    <TestData>
        <xsl:apply-templates/>
    </TestData>
</xsl:template>
<xsl:template match="/ROOT/REPLIST/NAME[.=/ROOT/DATALIST/ExtractedName]">
    <FormName>
        <xsl:value-of select="translate(.,'.xml','')"/>
    </FormName>
</xsl:template>
<xsl:template match="text()">
</xsl:template>

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: xml sorting xslt xslt-1.0


    【解决方案1】:

    你可以这样做:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output indent="yes"/>
      <xsl:output method="xml" omit-xml-declaration="yes" standalone="no"/>
      <xsl:key name="kExtract" match="ExtractedName" use="."/>
    
      <xsl:template match="/ROOT">
        <TestData>
          <xsl:apply-templates select="REPLIST/NAME[key('kExtract', .)]">
            <xsl:sort select="string-length(substring-before(., '.xml'))"
                      data-type="number" order="descending"/>
          </xsl:apply-templates>
        </TestData>
      </xsl:template>
    
      <xsl:template match="REPLIST/NAME">
        <FormName>
          <xsl:value-of select="substring-before(., '.xml')"/>
        </FormName>
      </xsl:template>
    </xsl:stylesheet>
    

    在您的示例输入上运行时,会产生:

    <TestData>
      <FormName>JKLMNOPQRST</FormName>
      <FormName>ABCDEFGH</FormName>
      <FormName>ABCDEFG</FormName>
      <FormName>JKLMN</FormName>
      <FormName>ABCD</FormName>
    </TestData>
    

    【讨论】:

      【解决方案2】:

      更短、更简单、更强大的解决方案

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output omit-xml-declaration="yes" indent="yes"/>
       <xsl:key name="kNameByVal" match="NAME" use="."/>
      
       <xsl:template match="REPLIST">
        <TestData>
         <xsl:apply-templates select=
           "key('kNameByVal', /*/DATALIST/*)">
           <xsl:sort select="-string-length()" data-type="number"/>
         </xsl:apply-templates>
        </TestData>
       </xsl:template>
      
       <xsl:template match="NAME">
        <FormName><xsl:value-of select="substring(.,1, string-length()-4)"/></FormName>
       </xsl:template>
       <xsl:template match="text()"/>
      </xsl:stylesheet>
      

      当此转换应用于提供的 XML 文档时:

      <ROOT>
          <REPLIST>
              <NAME>ABCDE.xml</NAME>
              <NAME>ABCDEFGH.xml</NAME>
              <NAME>ABC.xml</NAME>
              <NAME>ABCDEFG.xml</NAME>
              <NAME>ABCD.xml</NAME>
              <NAME>ABCDEF.xml</NAME>
              <NAME>JKLMNOPQRST.xml</NAME>
              <NAME>JKLMNOPQRS.xml</NAME>
              <NAME>JKLMNOPQ.xml</NAME>
              <NAME>JKLMN.xml</NAME>
          </REPLIST>
          <DATALIST>
              <ExtractedName>ABCDEFGH.xml</ExtractedName>
              <ExtractedName>JKLMN.xml</ExtractedName>
              <ExtractedName>ABCDEFG.xml</ExtractedName>
              <ExtractedName>ABCD.xml</ExtractedName>
              <ExtractedName>JKLMNOPQRST.xml</ExtractedName>
              <ExtractedName>ABCDEFG.xml</ExtractedName>
          </DATALIST>
      </ROOT>
      

      产生想要的正确结果

      <TestData>
         <FormName>JKLMNOPQRST</FormName>
         <FormName>ABCDEFGH</FormName>
         <FormName>ABCDEFG</FormName>
         <FormName>JKLMN</FormName>
         <FormName>ABCD</FormName>
      </TestData>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多