问题描述
我有一个不错的XSLT代码,可以根据字符串中的空格将XML文件中的“ p”(段落)元素的文本分解为“ w”(word)元素。 但是,我只希望这会影响属性@xml:lang的值为'arn'的'p'元素。 (我也希望新的'w'元素继承'@xml:lang ='arn'属性和值,但这是次要的)。 我已经通过在匹配模板中添加“ p [@xml:lang ='arn'] / text()”来修改代码。对于普通的XML文件,此方法工作正常,但一旦我尝试转换TEI文件,该文件就会恢复原样。
这是我的输入内容:
numeric(18,2)
还有我的XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<text>
<body>
<div>
<p xml:lang="arn">Fei meu nùkei neməl təfa</p>
<p xml:lang="spa">Entonces toma la palabra él</p>
<p xml:lang="arn">Fei meu nùkei neməl təfa</p>
<p xml:lang="spa">Entonces toma la palabra él</p>
</div>
</body></text>
这给了我想要的输出:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="@*|node()" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p[@xml:lang='arn']/text()[normalize-space()]">
<xsl:variable name='orig' select="."/>
<xsl:variable name='lang' select="$orig/ancestor::*[normalize-space(@xml:lang)][1]/@xml:lang"/>
<xsl:analyze-string select="." regex="[\p{{L}}\p{{N}}]+">
<xsl:matching-substring>
<xsl:element name="w">
<xsl:attribute name="xml:lang"><xsl:value-of select="$lang"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
但是,当输入具有TEI标头时,如下所示,我将返回输入文件。
<?xml version="1.0" encoding="UTF-8"?><text>
<body>
<div>
<p xml:lang="arn"><w xml:lang="arn">Fei</w> <w xml:lang="arn">meu</w> <w xml:lang="arn">nùkei</w> <w xml:lang="arn">neməl</w> <w xml:lang="arn">təfa</w></p>
<p xml:lang="spa">Entonces toma la palabra él</p>
<p xml:lang="arn"><w xml:lang="arn">Fei</w> <w xml:lang="arn">meu</w> <w xml:lang="arn">nùkei</w> <w xml:lang="arn">neməl</w> <w xml:lang="arn">təfa</w></p>
<p xml:lang="spa">Entonces toma la palabra él</p>
</div>
</body></text>
有什么建议可以避免这种情况?
解决方法
在第二个版本中,整个XML位于默认名称空间index.html
中。因此,在根元素上定义的该名称空间的所有子代都在同一名称空间中。
一种简单的解决方案是添加行
"http://www.tei-c.org/ns/1.0"
到您的XSLT的xpath-default-namespace="http://www.tei-c.org/ns/1.0"
元素。