XSLT 1.0:带有以下同级条件的括起来的标记



当标签直接跟随兄弟姐妹时,我尝试用标签作者:(姓氏和名字(标签括起来。如果不以这种方式排序,只需直接包围标签(名字或姓氏(。此标记由特定属性 (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父级中的surnames和forename,而不是使用bilbo属性。

相关内容

  • 没有找到相关文章

最新更新