2

私は父の分野に基づいて祖父母を分類することに取り組んでいます。ソースファイルは次のようになります

<Root>
    <AllData>
        <Data_not_to_be_sorted>
            <Additional_data1>
                <Some_test_data1/>
                <Some_test_data2/>
            </Additional_data1>
        </Data_not_to_be_sorted>
        <RealData>
            <Some_data1/>
            <Some_data2/>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                    <Father>
                        <Value>4</Value>
                        <Name>name in 4</Name>
                    </Father>
            </GrandFather>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                <Father>
                    <Value>3</Value>
                    <Name>name in 3</Name>
                </Father>
            </GrandFather>
        </RealData>
        <RealData>
            <Some_data1/>
            <Some_data2/>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                <Father>
                    <Value>2</Value>
                    <Name>name in 2</Name>
                </Father>
            </GrandFather>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                <Father>
                    <Value>1</Value>
                    <Name>name in 1</Name>
                </Father>
            </GrandFather>
        </RealData>
    </AllData>
</Root>

私が使用しているXSLTコードは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

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



<xsl:template match="RealData">
<xsl:copy>
<xsl:apply-templates select="Data_required_as_it_is"></xsl:apply-templates>
<xsl:apply-templates select="GrandFather">
<xsl:sort select="Father/Value" data-type="number"/>
</xsl:apply-templates>

</xsl:copy>

</xsl:template>

</xsl:stylesheet>

コードはうまく機能しています...私のクエリは-の一般的な行を書くことができますか

Data_required_as_it_is。「Data_required_as_it_is」に20の異なるxmlタグがある状況を想像してみてください。そのため、すべてを手動で書き込むか、一般的な方法で書き込む必要があります...

コードの出力は次のとおりです。

<Root>
    <AllData>
        <Data_not_to_be_sorted>
            <Additional_data1>
                <Some_test_data1/>
                <Some_test_data2/>
            </Additional_data1>
        </Data_not_to_be_sorted>
        <RealData>
            <Some_data1/>
            <Some_data2/>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                    <Father>
                        <Value>3</Value>
                        <Name>name in 3</Name>
                    </Father>
            </GrandFather>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                <Father>
                    <Value>4</Value>
                    <Name>name in 4</Name>
                </Father>
            </GrandFather>
        </RealData>
        <RealData>
            <Some_data1/>
            <Some_data2/>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                <Father>
                    <Value>1</Value>
                    <Name>name in 1</Name>
                </Father>
            </GrandFather>
            <GrandFather>
                <Data_required_as_it_is></Data_required_as_it_is>
                <Father>
                    <Value>2</Value>
                    <Name>name in 2</Name>
                </Father>
            </GrandFather>
        </RealData>
    </AllData>
</Root>
4

2 に答える 2

2
<xsl:template match="RealData">
      <xsl:copy>
          <xsl:apply-templates select="Data_required_as_it_is"></xsl:apply-templates>
          <xsl:apply-templates select="GrandFather">
              <xsl:sort select="Father/Value" data-type="number"/>
          </xsl:apply-templates>
      </xsl:copy>
  </xsl:template>

次のようなより一般的なコードを使用できます

<xsl:template match="RealData">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:sort select="self::GrandFather/Father/Value" data-type="number"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

:これにより、ノードのGrandFather前に非ノードが並べ替えられ、要素GrandFatherごとに指定さGrandFatherれたFather/Value要素の並べ替えが行われます。

GrandFather非要素が要素内に散在していることが望ましい場合はGrandFather、これも実行できます。興味がある場合は、別の質問をしてください。

于 2012-05-07T13:18:04.710 に答える
1

この時点でGrandFather要素ではないものと一致させたい場合は、次のようなことができるはずです。

<xsl:apply-templates select="*[not(self::GrandFather)]"></xsl:apply-templates> 

ただし、既存のGrandFather要素の後に要素がある場合は、この場合、出力で並べ替えられたGrandFather要素の前に移動されることに注意してください。

于 2012-05-07T12:40:31.000 に答える