Xslt:如何使用参数更改元素中的节点文本

时间:2014-11-21 17:48:40

标签: xml xslt

我需要更改某些节点的文本,类似于Update the text of an element with XSLT based on param

这是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
    <teiHeader>
        <fileDesc>
            <titleStmt>
                <title />
            </titleStmt>
            <publicationStmt>
                <p />
            </publicationStmt>
            <sourceDesc>
                <p />
            </sourceDesc>
        </fileDesc>
        <encodingDesc>
            <appInfo>
                <application ident="TEI_fromDOCX" version="2.15.0">
                    <label>DOCX to TEI</label>
                </application>
            </appInfo>
        </encodingDesc>
        <revisionDesc>
            <change>
                <date>$LastChangedDate: 2014-10-19$</date>
            </change>
        </revisionDesc>
    </teiHeader>
    <text>
        <body xml:id="test">
            <head>DICTIONARY</head>
            <entry>
                <form type="hyperlemma" xml:lang="cu">
                    <orth>абиѥ</orth>
                </form>
                <form type="lemma" xml:lang="cu">
                    <orth>абиѥ</orth>
                </form>
                <form type="variant" xml:lang="cu">
                    <orth>а̓бїе</orth>
                    <form type="hyperlemma" xml:lang="cu">
                        <orth>а̓бїе</orth>
                    </form>
                </form>
            </entry>
        </body>
    </text>
</TEI>

我现在想要替换

中的<orth>之间的文字
<form type="variant" xml:lang="cu">
    <orth>а̓бїе</orth>
    <form type="hyperlemma" xml:lang="cu">
        <orth>а̓бїе</orth>
    </form>
</form>

前一节点中<orth>的内容

<entry>
    <form type="hyperlemma" xml:lang="cu">
        <orth>абиѥ</orth>
    </form>

以获得以下输出:

<entry>
    <form type="hyperlemma" xml:lang="cu">
        <orth>абиѥ</orth>
    </form>
    <form type="lemma" xml:lang="cu">
        <orth>абиѥ</orth>      
    </form>
    <form type="variant" xml:lang="cu">
        <orth>а̓бїе</orth>
        <form type="hyperlemma" xml:lang="cu">
            <orth>абиѥ</orth>
        </form>
    </form>
 <entry>

当我使用以下样式表

<?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" xpath-default-namespace="http://www.tei-c.org/ns/1.0" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:param name="replace_orth" select="entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" />

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="form[@type='variant']/form[@type='hyperlemma' and @xml:lang='cu']/orth/text()">
    <xsl:value-of select="$replace_orth" />
</xsl:template>
</xsl:stylesheet>

然后我得到

<form type="variant" xml:lang="cu">
    <orth>а̓бїе</orth>
    <form type="hyperlemma" xml:lang="cu">
         <orth/>
</form>

所以<orth>是空的。如果我将参数更改为

<xsl:param name="replace_orth" select="'new orth'" />

'new orth'被打印出来。但由于每个条目<entry><form type="hyperlemma" xml:lang="cu"><orth>的内容不同(在上面的示例XML中我只显示一个条目),我不能使用'静态'字符串。

我需要改变什么?

感谢任何提示!

2 个答案:

答案 0 :(得分:1)

您必须从xpath-default-namespace="http://www.tei-c.org/ns/1.0"元素中删除属性xsl:stylesheet。默认情况下,此属性将提到的uri作为命名空间uri应用于xpath中的所有元素。

实施例: 如果运行以下XML(输入中的一部分):

<entry>
<form type="hyperlemma" xml:lang="cu">
     <orth>value</orth>
</form>
</entry>

针对此XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.tei-c.org/ns/1.0" version="2.0">
<xsl:output method="text" indent="yes" />
<xsl:param name="replace_orth" select="entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" />

<xsl:template match="/">
    <xsl:value-of select="$replace_orth"/>
</xsl:template>
</xsl:stylesheet>

输出什么都没有。 原因是默认情况下,所有xpath元素都应该具有名称空间http://www.tei-c.org/ns/1.0。因此,teh param replace_orth没有选择任何内容,因为输入XML没有任何元素的命名空间。

但是,如果您将输入XML更改为以下内容:

<entry xmlns="http://www.tei-c.org/ns/1.0">
<form type="hyperlemma" xml:lang="cu">
     <orth>value</orth>
</form>
</entry>

输出将是: value

这是因为输入XML中所有元素的默认命名空间是http://www.tei-c.org/ns/1.0

答案 1 :(得分:1)

问题是您没有选择xsl:param的任何内容。您必须指定orth的完整路径或使用//

<xsl:param name="replace_orth" 
select="/TEI/text/body/entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" />

<xsl:param name="replace_orth" 
select="//entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" />