我需要更改某些节点的文本,类似于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中我只显示一个条目),我不能使用'静态'字符串。
我需要改变什么?
感谢任何提示!
答案 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" />