XSLT根据包含元素的属性值分解XML文本不';我不在TEI工作

XSLT根据包含元素的属性值分解XML文本不';我不在TEI工作,xml,xslt,tei,Xml,Xslt,Tei,我有一个很好的XSLT代码,可以根据字符串中的空格将XML文件中“p”(段落)元素的文本分解为“w”(word)元素。 但是,我只希望这会影响@xml:lang属性值为'arn'的'p'元素(我还希望新的'w'元素继承'@xml:lang='arn'属性和值,但这是次要的)。 我修改了代码,将“p[@xml:lang='arn']/text()”添加到我的匹配模板中。这对于普通的XML文件很好,但只要我尝试转换TEI文件,该文件就会原封不动地返回 以下是我的意见: <?xml versio

我有一个很好的XSLT代码,可以根据字符串中的空格将XML文件中“p”(段落)元素的文本分解为“w”(word)元素。 但是,我只希望这会影响@xml:lang属性值为'arn'的'p'元素(我还希望新的'w'元素继承'@xml:lang='arn'属性和值,但这是次要的)。 我修改了代码,将“p[@xml:lang='arn']/text()”添加到我的匹配模板中。这对于普通的XML文件很好,但只要我尝试转换TEI文件,该文件就会原封不动地返回

以下是我的意见:

<?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>

Fei meu nùkei neməl təfa

托马宫殿酒店

Fei meu nùkei neməl təfa

托马宫殿酒店

还有我的XSLT:

<?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>

这将为我提供所需的输出:

<?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>

Fei meu nùkei neməl təfa

托马宫殿酒店

Fei meu nùkei neməl təfa

托马宫殿酒店

但是,当输入有一个TEI头时,如下所示,我将返回输入文件

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
    <teiHeader>
        <fileDesc>
            <titleStmt>
                <title></title>
            </titleStmt>
            <publicationStmt><ab></ab></publicationStmt>
            <sourceDesc><ab></ab></sourceDesc>
        </fileDesc>
    </teiHeader>
    <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>
</TEI>

Fei meu nùkei neməl təfa

托马宫殿酒店

Fei meu nùkei neməl təfa

托马宫殿酒店


有没有避免这种情况的建议?

在第二个版本中,您的整个XML都位于默认名称空间
”http://www.tei-c.org/ns/1.0“
。因此,在根元素上定义的该名称空间的所有子项都位于同一名称空间中

一个简单的解决方案是添加行

xpath-default-namespace="http://www.tei-c.org/ns/1.0"
到XSLT的
xsl:stylesheet
元素