XSLT:如何修复不复制属性值的xsl:sort

时间:2019-07-12 15:04:42

标签: xml xslt

我有一个XML文件,我想按字母顺序对div元素进行排序。同样在div元素内部,我也需要按字母顺序对ab元素进行排序。 XSLT代码基本上可以正常工作。但是最后,div元素中的属性n =“ ...”丢失了。

这是XML:

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:telota="http://www.telota.de" xmlns:hkg="http://www.gotthelf.unibe.ch" telota:doctype="ortsregister">
<text>
    <body>
        <div n="B">
            <ab xml:id="o0bcb42e7-b931-47a2-95e8-6c5ff6c5149d">
                <seg type="placeName">
                    <settlement>Berlin</settlement>
                </seg>
            </ab>
            <ab xml:id="o_glr_1xp_j3b">
                <seg type="placeName">
                    <settlement>Bonn</settlement>
                </seg>
            </ab>
            <ab xml:id="ob22d4b9b-4c4a-43fb-86fe-75f76938eb74">
                <seg type="placeName">
                    <settlement>Bern</settlement>
                </seg>
            </ab>
        </div>
        <div n="A">
            <ab xml:id="o70758a9e-41fc-40e9-a859-bdbdffe8a085">
                <seg type="placeName">
                    <settlement>Aarhus</settlement>
                    <region>Dänemark</region>
                </seg>
            </ab>
            <ab xml:id="o_x5p_4wp_j3b">
                <seg type="placeName">
                    <settlement>Aareschlaufe</settlement>
                </seg>
            </ab>
        </div>
    </body>
</text>
</TEI>

这是我的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:hkg="http://www.gotthelf.unibe.ch">
<xsl:output method="xml" indent="yes" />

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

<xsl:template match="tei:body">
    <xsl:copy>
        <xsl:apply-templates select="tei:div">
            <xsl:sort select="@n" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="tei:div">
    <xsl:copy>
        <xsl:apply-templates select="tei:ab">
            <xsl:sort select="tei:seg/tei:settlement" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

这是我在运行XSLT之后收到的XML:

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:telota="http://www.telota.de" xmlns:hkg="http://www.gotthelf.unibe.ch" telota:doctype="ortsregister">
<text>
    <body>
        <div>
            <ab xml:id="o_x5p_4wp_j3b">
                <seg type="placeName">
                    <settlement>Aareschlaufe</settlement>
                </seg>
            </ab>
            <ab xml:id="o70758a9e-41fc-40e9-a859-bdbdffe8a085">
                <seg type="placeName">
                    <settlement>Aarhus</settlement>
                    <region>Dänemark</region>
                </seg>
            </ab>
        </div>
        <div>
            <ab xml:id="o0bcb42e7-b931-47a2-95e8-6c5ff6c5149d">
                <seg type="placeName">
                    <settlement>Berlin</settlement>
                </seg>
            </ab>
            <ab xml:id="ob22d4b9b-4c4a-43fb-86fe-75f76938eb74">
                <seg type="placeName">
                    <settlement>Bern</settlement>
                </seg>
            </ab>
            <ab xml:id="o_glr_1xp_j3b">
                <seg type="placeName">
                    <settlement>Bonn</settlement>
                </seg>
            </ab>
        </div>
    </body>
</text>
</TEI>

因此div元素不再具有任何属性n =“ ...”。这就是我打算拥有的:

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:telota="http://www.telota.de" xmlns:hkg="http://www.gotthelf.unibe.ch" telota:doctype="ortsregister">
<text>
    <body>
        <div n="A">
            <ab xml:id="o_x5p_4wp_j3b">
                <seg type="placeName">
                    <settlement>Aareschlaufe</settlement>
                </seg>
            </ab>
            <ab xml:id="o70758a9e-41fc-40e9-a859-bdbdffe8a085">
                <seg type="placeName">
                    <settlement>Aarhus</settlement>
                    <region>Dänemark</region>
                </seg>
            </ab>
        </div>
        <div n="B">
            <ab xml:id="o0bcb42e7-b931-47a2-95e8-6c5ff6c5149d">
                <seg type="placeName">
                    <settlement>Berlin</settlement>
                </seg>
            </ab>
            <ab xml:id="ob22d4b9b-4c4a-43fb-86fe-75f76938eb74">
                <seg type="placeName">
                    <settlement>Bern</settlement>
                </seg>
            </ab>
            <ab xml:id="o_glr_1xp_j3b">
                <seg type="placeName">
                    <settlement>Bonn</settlement>
                </seg>
            </ab>
        </div>
    </body>
</text>
</TEI>

我了解到很多有关该副本仅复制节点但不复制其属性的信息。但是,我仍然没有得到改善我的代码所必须做的事情。因此,感谢您提供任何有用的提示。

如果我给了太多代码,对不起。如果您需要了解更多信息,请告诉我。预先感谢。

1 个答案:

答案 0 :(得分:1)

可以通过身份模板完成属性的复制,但是要实现此目的,您首先必须选择要复制的属性。

因此,在您的情况下,请将匹配tei:div的模板更改为此...

<xsl:template match="tei:div">
    <xsl:copy>
        <xsl:apply-templates select="@*|tei:ab">
            <xsl:sort select="tei:seg/tei:settlement" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:apply-templates select="@*|tei:ab">是此处的相关行,因此它选择属性以及tei:ab元素。