我有一个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>
我了解到很多有关该副本仅复制节点但不复制其属性的信息。但是,我仍然没有得到改善我的代码所必须做的事情。因此,感谢您提供任何有用的提示。
如果我给了太多代码,对不起。如果您需要了解更多信息,请告诉我。预先感谢。
答案 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
元素。