当标签直接跟随兄弟姐妹时,我尝试用标签作者:(姓氏和名字(标签括起来。如果不以这种方式排序,只需直接包围标签(名字或姓氏(。此标记由特定属性 (bilbo( 指定。所有标签都获得默认命名空间,我需要使用 XSLT 1.0。
这是我的 xml 输入。
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<surname> Amblard </surname>
<bibl>
<surname bilbo="True"> Amblard </surname>
<forename bilbo="True"> F. </forename>
<c bilbo="True"> , </c>
<forename bilbo="True"> P. </forename>
<title>titre</title>
<surname bilbo="True"> Amblard </surname>
</bibl>
</TEI>
这是我的 xsl 文件:
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:tei = "http://www.tei-c.org/ns/1.0">
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tei:surname[@bilbo]">
<xsl:element name="author" namespace="http://www.tei-c.org/ns/1.0">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<xsl:if test="following-sibling::*[1][self::forename and @bilbo]">
<xsl:copy-of select="following-sibling::*[1]"/>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="tei:forename[@bilbo]">
<xsl:if test="not(preceding-sibling::*[1][self::surname and @bilbo])">
<xsl:element name="author" namespace="http://www.tei-c.org/ns/1.0">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出为 :
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<surname> Amblard </surname>
<bibl>
<author>
<surname bilbo="True"> Amblard </surname>
</author>
<author>
<forename bilbo="True"> F. </forename>
</author>
<c bilbo="True"> , </c>
<author>
<forename bilbo="True"> P. </forename>
</author><title>titre</title>
<author>
<surname bilbo="True"> Amblard </surname>
</author>
</bibl>
</TEI>
但预期输出应为:
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<surname> Amblard </surname>
<bibl>
<author>
<surname bilbo="True"> Amblard </surname>
<forename bilbo="True"> F. </forename>
</author>
<c bilbo="True"> , </c>
<author>
<forename bilbo="True"> P. </forename>
</author><title>titre</title>
<author>
<surname bilbo="True"> Amblard </surname>
</author>
</bibl>
</TEI>
请注意,这篇文章遵循以前的票证:(xslt 转换和 lxml python 问题来处理命名空间。提前感谢任何帮助。
这很难理解。如果我正确理解了所需的逻辑,那么在XSLT 1.0中实现需要做很多工作:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tei="http://www.tei-c.org/ns/1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- leading surname -->
<xsl:template match="tei:surname[@bilbo][following-sibling::*[1][self::tei:forename]]" priority="1">
<xsl:element name="author" namespace="http://www.tei-c.org/ns/1.0">
<xsl:copy-of select=". | following-sibling::tei:forename[1][@bilbo]"/>
</xsl:element>
</xsl:template>
<!-- leading forename -->
<xsl:template match="tei:forename[@bilbo][following-sibling::*[1][self::tei:surname]]" priority="1">
<xsl:element name="author" namespace="http://www.tei-c.org/ns/1.0">
<xsl:copy-of select=". | following-sibling::tei:surname[1][@bilbo]"/>
</xsl:element>
</xsl:template>
<!-- surname or forename, standalone -->
<xsl:template match="tei:surname[@bilbo] | tei:forename[@bilbo]">
<xsl:element name="author" namespace="http://www.tei-c.org/ns/1.0">
<xsl:copy-of select="."/>
</xsl:element>
</xsl:template>
<!-- trailing surname -->
<xsl:template match="tei:surname[@bilbo][preceding-sibling::*[1][self::tei:forename]]"/>
<!-- trailing forename -->
<xsl:template match="tei:forename[@bilbo][preceding-sibling::*[1][self::tei:surname]]"/>
</xsl:stylesheet>
也许使用同级递归来解决这个问题会更简单。但这意味着更改给定的规则,将逻辑应用于bibl
父级中的surname
s和forename
,而不是使用bilbo
属性。