XSLT - 一个通用的规则适用模板中包含多个节点(XSLT - A generic rule i

2019-09-17 02:15发布

我工作过的排序基于在父字段中的祖父母。 源文件看起来像

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

Answer 1:

 <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元素,这也可以实现-如果有兴趣问另外一个问题。



Answer 2:

如果你想匹配任何不是在这一点上祖父元素,你应该能够做这样的事情:

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

请注意,如果您有任何现有的祖父元素之后的元素,他们将在输出排序祖父元素在这种情况下,虽然前移至。



文章来源: XSLT - A generic rule in apply template to include multiple nodes
标签: xslt