1

データ内の文字数に基づいて 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>

これに関するヘルプは大歓迎です。

4

2 に答える 2

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>
于 2013-03-14T19:03:01.710 に答える
1

より短く、よりシンプルで、より堅牢なソリューション:

<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>
于 2013-03-15T03:23:43.050 に答える