xsl:删除当前节点的重复出现
xsl: removing duplicate occurrence of a current node
在此 post Compare variable in preceding-sibling with current node 之后,我尝试比较当前节点以删除重复项。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [
<!ENTITY menu SYSTEM "verb.xml">
]>
<xsl:variable name="gram" as="xs:string*" select="*//gramGrp/string-join((iType/@value, mood/@value, tns/@value, subc/@value), '. ')"/>
<xsl:variable name="actor-affixes" as="xs:string*" select="*//gramGrp/string-join((per/@value, gen/@value, number/@value), '')"/>
<xsl:for-each select="w[@n | @lemma]">
<ul>
<li><xsl:variable name="inflected">
<xsl:for-each select="*/m[@type='pref']">
<xsl:value-of select="current()"/>
<xsl:choose>
<xsl:when test="."><xsl:text>-</xsl:text></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="*//m[@type='baseForm']">
<xsl:variable name="str1">
<xsl:value-of select="current()[not != c[@type['infix']]] |node()"/>
</xsl:variable>
<xsl:value-of select="translate(normalize-space($str1), ' ', '-')"/>
</xsl:for-each>
<xsl:for-each select="*//m[@type='suff']">
<xsl:variable name="str2">
<xsl:if test="position() = last()"><xsl:text>-</xsl:text><xsl:value-of select="."/></xsl:if>
</xsl:variable>
<xsl:value-of select="concat($str2, '')"/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$inflected"/>
<xsl:text>: </xsl:text>
<xsl:variable name="gram-affixes">
<xsl:if test="$gram = preceding-sibling::node()/$gram">
<xsl:value-of select="$gram"/>
</xsl:if>
<xsl:text>.</xsl:text>
<xsl:value-of select="$actor-affixes" separator=", "/><xsl:text>.</xsl:text>
</xsl:variable>
<xsl:value-of select="$gram-affixes"/>
</li>
</ul>
</xsl:for-each>
内容来自 TEI-XML
<w n="1" lemma="tmtḫṣ" xml:id="tmtḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">m<c type="infix" ana="#infix-t">t</c>ḫṣ</m>
</m>
</w>
<w n="2" lemma="tmḫṣ" xml:id="tmḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">mḫṣ</m>
</m>
</w>
<gramGrp type="baseForm" ana="#mḫṣ">
<gramGrp n="1" ana="#tmtḫṣ">
<iType ana="#sstem.Gt" value="Gt" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.imperf" value="imperf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
<gramGrp n="2" ana="#tmḫṣ">
<iType ana="#sstem.D" value="D" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.perf" value="perf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
</gramGrp>
我也尝试过:<xsl:for-each select="distinct-values($gram)"><xsl:value-of select="normalize-space(.)"/></xsl:for-each>
(以下 Compare variable in preceding-sibling with current node)和 <xsl:for-each select="$gram[not(. = preceding-sibling::node()/$gram)]"><xsl:value-of select="$gram"/></xsl:for-each>
。但是没用...
当前输出为:
<ul><li>t-m-t-ḫṣ: Gt. ind. imperf. transD. ind. perf. trans., 2msg, 3fsg, , 2msg, 3fsg.</li></ul>
<ul><li>t-mḫṣ: Gt. ind. imperf. transD. ind. perf. trans., 2msg, 3fsg, , 2msg, 3fsg.</li></ul>
但是如您所见,“:”后面的事件是相同的。应该是:
<ul><li>t-m-t-ḫṣ: Gt. ind. imperf. trans., 2msg, 3fsg.</li></ul>
<ul><li>t-mḫṣ: D. ind. perf. trans., 2msg, 3fsg.</li></ul>
更新:
根据建议,我已经更新了一个新版本以包含所有TEI
element
。它工作正常。但是我在评论中添加了 <!-- -->
额外的问题。我想我还是不明白 key
是如何工作的。我不知道我是否需要添加一个新的 post -- 如果是,请道歉 -- :你能解释一下 key
是如何工作的吗?
TEI:
<entryFree n="6" xml:id="mḫṣ">
<form type="verb">
<orth>mḫṣ</orth>
</form>
<form type="inflected">
<w n="1" lemma="tmtḫṣ" xml:id="tmtḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">m<c type="infix" ana="#infix-t">t</c>ḫṣ</m>
</m>
</w>
<w n="2" lemma="tmḫṣ" xml:id="tmḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">mḫṣ</m>
</m>
</w>
<gramGrp type="baseForm" ana="#mḫṣ">
<gramGrp n="1" ana="#tmtḫṣ">
<iType ana="#sstem.Gt" value="Gt" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.imperf" value="imperf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
<gramGrp n="2" ana="#tmḫṣ">
<iType ana="#sstem.D" value="D" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.perf" value="perf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
</gramGrp>
</form>
<sense n="1" ana="#mḫṣ" xml:id="mḥṣ01">to fight</sense>
<sense n="2" ana="#mḥṣ" xml:id="mḥṣ02">to destroy</sense>
<re n="1" ana="#tmtḫṣ #mḫṣ01" type="inflected" >
<sense>She fought <span>iterative function // with <ref
target="../computation/corpus_ilimilku.xml#ktu1-3_ii_l6b_tḫtṣb">tḫtṣb</ref></span>
<span type="interp"><ref target="../computation/corpus_ilimilku.xml#ktu1-3_ii_l5b_6a_int">Hermeneutics</ref></span>
<span ana="../computation/corpus_ilimilku.xml#contend"><reftarget="../computation/corpus_ilimilku.xml#mḫṣ01">Taxonomy, subcategory ofcompetition verb: contend</ref></span>
</sense>
</re>
<re n="2" ana="#tmḫṣ #mḫṣ02" type="inflected">
<sense>She destroyed <span type="interp"><ref target="../computation/corpus_ilimilku.xml#ktu1-3_ii_l7_int">Hermeneutics</ref></span>
<span ana="../computation/corpus_ilimilku.xml#humiliation"><ref target="../computation/corpus_ilimilku.xml#mḫṣ02">Taxonomy, subcategory of emotion's verb as a concept of: humiliation</ref></span>
</sense>
</re>
</entryFree>
XSL 已更新:
<?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"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="xs math map array" version="3.0">
<xsl:output method="html" encoding="utf-8" doctype system="about:legacy-compat"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="gramGrp" match="gramGrp[@n and @ana]" composite="yes" use="@n, substring(@ana, 2)"/>
<!-- <xsl:key name="re" match="re[@n and @ana[1]]" composite="yes" use="@n, substring(@ana, 2)" /> -->
<xsl:template match="entryFree">
<xsl:variable name="orth" select="*/orth/text()" />
<h3><xsl:value-of select="$orth"/></h3>
<xsl:text> Mean.: </xsl:text><xsl:value-of select="*//following-sibling::sense[@xml:id]" separator=", " /><xsl:text>.</xsl:text>
<ul><xsl:for-each select="*/w[@n | @lemma]">
<xsl:variable name="pref" as="xs:string*" select="string-join(m[@type = 'base']/m, '')"/>
<xsl:variable name="referenced-gramGrp" select="key('gramGrp', (@n, @lemma))"/>
<xsl:variable name="gram" as="xs:string*" select="$referenced-gramGrp/string-join((iType/@value, mood/@value, tns/@value, subc/@value), '. ')"/>
<xsl:variable name="actor-affixes" as="xs:string*" select="$referenced-gramGrp/gramGrp/string-join((per/@value, gen/@value, number/@value), '')"/>
<!-- <xsl:variable name="referenced-re" select="key('re', (ancestor-or-self::w/@xml:id))" />
<xsl:variable name="trans" as="xs:string*" select="$referenced-re/string-join(following::re/sense, '')"/> -->
<li>
<xsl:value-of select="$pref"/>
<xsl:text>: </xsl:text>
<xsl:value-of select="$gram, $actor-affixes" separator=", "/>
<xsl:text>. </xsl:text>Trans.
<!-- <xsl:value-of select="$trans" separator=". "/> -->
</li>
</xsl:for-each></ul>
</xsl:template>
<xsl:template match="gramGrp"/>
<!-- <xsl:template match="re"/> -->
</xsl:stylesheet>
输出:
<h3>mḫṣ</h3>
Mean.: to fight, to destroy.
<ul>
<li>tmtḫṣ: Gt. ind. imperf. trans, 2msg, 3fsg. Trans.
<!-- '$trans'-->
</li>
<li>tmḫṣ: D. ind. perf. trans, 2msg, 3fsg. Trans.
<!-- $trans' -->
</li>
</ul>
很遗憾,$trans
没有输出。我错了什么?
可以在此处找到更新版本:http://xsltfiddle.liberty-development.net/3Nqn5Y4
提前感谢您对xsl
新手的支持。
有两种方法可以回答这样的问题:(a) 指出您的代码有什么问题,以及 (b) 提供可行的解决方案。我要做(a);也许其他人会做 (b)。
这里有一些非常可怕的代码。先说临界区:
<xsl:if test="$gram = preceding-sibling::node()/$gram">
<xsl:value-of select="$gram"/>
</xsl:if>
在“/”右侧使用变量引用确实没有意义。事实上,使用任何其值不依赖于上下文项的表达式是没有意义的。 X/$gram
给你一个包含 N 次出现的 $gram
的序列(其中 N 是 X 的大小),并且由于所有这些都等于 $gram
,你的条件将始终为真。我不知道这段代码试图实现什么。
这里还有其他一些没有意义的东西。
<xsl:choose>
<xsl:when test="."><xsl:text>-</xsl:text></xsl:when>
<xsl:otherwise/>
</xsl:choose>
从“.”开始是一个节点,它的有效布尔值永远为真,所以这段代码等价于
<xsl:text>-</xsl:text>
现在:
<xsl:variable name="str1">
<xsl:value-of select="
current()[not != c[@type['infix']]] |node()"/>
</xsl:variable>
<xsl:value-of select="
translate(normalize-space($str1), ' ', '-')"/>
首先,构造
<xsl:variable name="V"><xsl:value-of select="X"/></xsl:variable>
几乎总是应该重写为
<xsl:variable name="V" select="X"/>
其次,此处的关键字 "not" 表示 "child::not" - 它正在寻找名为 "not" 的元素。这是故意的吗?
最后,current()
是一个 m
元素,源中的 m
元素只有一个文本节点子节点。将一个元素(受条件限制)和它的子文本节点合并,然后形成结果的字符串值,这似乎是一个非常奇怪的操作,很难想象它试图实现什么。
我想你想将变量移动到一个模板或 for-each 中,并使用正确的上下文节点,你想用一个键引用语法部分,这是一个 XSLT 3 样式表(可以是 运行 使用 Saxon 9.8 任何版本或更早的 PE 或 EE 版本和 Altova 2017 或 2018)尝试这样做:
<?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"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="xs math map array"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="gramGrp" match="gramGrp[@n and @ana]" composite="yes" use="@n, substring(@ana, 2)"/>
<xsl:template match="w[@n | @lemma]">
<ul>
<xsl:variable name="pref" as="xs:string" select="string-join(m[@type = 'base']/m, '')"/>
<xsl:variable name="referenced-gramGrp" select="key('gramGrp', (@n, @lemma))"/>
<xsl:variable name="gram" as="xs:string*" select="$referenced-gramGrp/string-join((iType/@value, mood/@value, tns/@value, subc/@value), '. ')"/>
<xsl:variable name="actor-affixes" as="xs:string*" select="$referenced-gramGrp/gramGrp/string-join((per/@value, gen/@value, number/@value), '')"/>
<li>
<xsl:value-of select="$pref" separator="-"/>
<xsl:text>: </xsl:text>
<xsl:value-of select="$gram, $actor-affixes" separator=", "/>
</li>
</ul>
</xsl:template>
<xsl:template match="gramGrp"/>
</xsl:stylesheet>
在http://xsltfiddle.liberty-development.net/jyyiVhf可以看到结果是
<root>
<ul><li>tmtḫṣ: Gt. ind. imperf. trans, 2msg, 3fsg</li></ul>
<ul><li>tmḫṣ: D. ind. perf. trans, 2msg, 3fsg</li></ul>
</root>
您需要添加代码,将 tmtḫṣ
之类的字符串分解为组件,因为我无法弄清楚它是如何工作的。
至于另一个键的编辑问题,不清楚你想select哪个值来形成键作为[=16=中的re
元素] 属性有一个 ID 列表。假设您只想使用第一个 id 作为键值,您可以使用
<xsl:key name="re" match="re[@n and @ana]" composite="yes" use="@n, tokenize(@ana, '\s+')[1]!substring(., 2)" />
然后
<xsl:variable name="referenced-re" select="key('re', (@n, @xml:id))" />
应该为您的示例数据找到一个 re
元素。
在此 post Compare variable in preceding-sibling with current node 之后,我尝试比较当前节点以删除重复项。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [
<!ENTITY menu SYSTEM "verb.xml">
]>
<xsl:variable name="gram" as="xs:string*" select="*//gramGrp/string-join((iType/@value, mood/@value, tns/@value, subc/@value), '. ')"/>
<xsl:variable name="actor-affixes" as="xs:string*" select="*//gramGrp/string-join((per/@value, gen/@value, number/@value), '')"/>
<xsl:for-each select="w[@n | @lemma]">
<ul>
<li><xsl:variable name="inflected">
<xsl:for-each select="*/m[@type='pref']">
<xsl:value-of select="current()"/>
<xsl:choose>
<xsl:when test="."><xsl:text>-</xsl:text></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="*//m[@type='baseForm']">
<xsl:variable name="str1">
<xsl:value-of select="current()[not != c[@type['infix']]] |node()"/>
</xsl:variable>
<xsl:value-of select="translate(normalize-space($str1), ' ', '-')"/>
</xsl:for-each>
<xsl:for-each select="*//m[@type='suff']">
<xsl:variable name="str2">
<xsl:if test="position() = last()"><xsl:text>-</xsl:text><xsl:value-of select="."/></xsl:if>
</xsl:variable>
<xsl:value-of select="concat($str2, '')"/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$inflected"/>
<xsl:text>: </xsl:text>
<xsl:variable name="gram-affixes">
<xsl:if test="$gram = preceding-sibling::node()/$gram">
<xsl:value-of select="$gram"/>
</xsl:if>
<xsl:text>.</xsl:text>
<xsl:value-of select="$actor-affixes" separator=", "/><xsl:text>.</xsl:text>
</xsl:variable>
<xsl:value-of select="$gram-affixes"/>
</li>
</ul>
</xsl:for-each>
内容来自 TEI-XML
<w n="1" lemma="tmtḫṣ" xml:id="tmtḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">m<c type="infix" ana="#infix-t">t</c>ḫṣ</m>
</m>
</w>
<w n="2" lemma="tmḫṣ" xml:id="tmḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">mḫṣ</m>
</m>
</w>
<gramGrp type="baseForm" ana="#mḫṣ">
<gramGrp n="1" ana="#tmtḫṣ">
<iType ana="#sstem.Gt" value="Gt" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.imperf" value="imperf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
<gramGrp n="2" ana="#tmḫṣ">
<iType ana="#sstem.D" value="D" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.perf" value="perf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
</gramGrp>
我也尝试过:<xsl:for-each select="distinct-values($gram)"><xsl:value-of select="normalize-space(.)"/></xsl:for-each>
(以下 Compare variable in preceding-sibling with current node)和 <xsl:for-each select="$gram[not(. = preceding-sibling::node()/$gram)]"><xsl:value-of select="$gram"/></xsl:for-each>
。但是没用...
当前输出为:
<ul><li>t-m-t-ḫṣ: Gt. ind. imperf. transD. ind. perf. trans., 2msg, 3fsg, , 2msg, 3fsg.</li></ul>
<ul><li>t-mḫṣ: Gt. ind. imperf. transD. ind. perf. trans., 2msg, 3fsg, , 2msg, 3fsg.</li></ul>
但是如您所见,“:”后面的事件是相同的。应该是:
<ul><li>t-m-t-ḫṣ: Gt. ind. imperf. trans., 2msg, 3fsg.</li></ul>
<ul><li>t-mḫṣ: D. ind. perf. trans., 2msg, 3fsg.</li></ul>
更新:
根据建议,我已经更新了一个新版本以包含所有TEI
element
。它工作正常。但是我在评论中添加了 <!-- -->
额外的问题。我想我还是不明白 key
是如何工作的。我不知道我是否需要添加一个新的 post -- 如果是,请道歉 -- :你能解释一下 key
是如何工作的吗?
TEI:
<entryFree n="6" xml:id="mḫṣ">
<form type="verb">
<orth>mḫṣ</orth>
</form>
<form type="inflected">
<w n="1" lemma="tmtḫṣ" xml:id="tmtḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">m<c type="infix" ana="#infix-t">t</c>ḫṣ</m>
</m>
</w>
<w n="2" lemma="tmḫṣ" xml:id="tmḫṣ" ana="#mḫṣ">
<m type="base">
<m type="pref" ana="#pref-t">t</m>
<m type="baseForm">mḫṣ</m>
</m>
</w>
<gramGrp type="baseForm" ana="#mḫṣ">
<gramGrp n="1" ana="#tmtḫṣ">
<iType ana="#sstem.Gt" value="Gt" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.imperf" value="imperf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
<gramGrp n="2" ana="#tmḫṣ">
<iType ana="#sstem.D" value="D" type="semantic-variations"/>
<mood ana="#mood.ind" value="ind"/>
<tns ana="#sasp.perf" value="perf"/>
<subc ana="#strans" value="trans"/>
<gramGrp n="1.1" ana="#actor-affixes">
<per ana="#s2" value="2"/>
<gen ana="#smasc" value="m"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
<gramGrp n="1.2" ana="#actor-affixes">
<per ana="#s3" value="3"/>
<gen ana="#sfem" value="f"/>
<number ana="#ssing" value="sg"/>
</gramGrp>
</gramGrp>
</gramGrp>
</form>
<sense n="1" ana="#mḫṣ" xml:id="mḥṣ01">to fight</sense>
<sense n="2" ana="#mḥṣ" xml:id="mḥṣ02">to destroy</sense>
<re n="1" ana="#tmtḫṣ #mḫṣ01" type="inflected" >
<sense>She fought <span>iterative function // with <ref
target="../computation/corpus_ilimilku.xml#ktu1-3_ii_l6b_tḫtṣb">tḫtṣb</ref></span>
<span type="interp"><ref target="../computation/corpus_ilimilku.xml#ktu1-3_ii_l5b_6a_int">Hermeneutics</ref></span>
<span ana="../computation/corpus_ilimilku.xml#contend"><reftarget="../computation/corpus_ilimilku.xml#mḫṣ01">Taxonomy, subcategory ofcompetition verb: contend</ref></span>
</sense>
</re>
<re n="2" ana="#tmḫṣ #mḫṣ02" type="inflected">
<sense>She destroyed <span type="interp"><ref target="../computation/corpus_ilimilku.xml#ktu1-3_ii_l7_int">Hermeneutics</ref></span>
<span ana="../computation/corpus_ilimilku.xml#humiliation"><ref target="../computation/corpus_ilimilku.xml#mḫṣ02">Taxonomy, subcategory of emotion's verb as a concept of: humiliation</ref></span>
</sense>
</re>
</entryFree>
XSL 已更新:
<?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"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="xs math map array" version="3.0">
<xsl:output method="html" encoding="utf-8" doctype system="about:legacy-compat"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="gramGrp" match="gramGrp[@n and @ana]" composite="yes" use="@n, substring(@ana, 2)"/>
<!-- <xsl:key name="re" match="re[@n and @ana[1]]" composite="yes" use="@n, substring(@ana, 2)" /> -->
<xsl:template match="entryFree">
<xsl:variable name="orth" select="*/orth/text()" />
<h3><xsl:value-of select="$orth"/></h3>
<xsl:text> Mean.: </xsl:text><xsl:value-of select="*//following-sibling::sense[@xml:id]" separator=", " /><xsl:text>.</xsl:text>
<ul><xsl:for-each select="*/w[@n | @lemma]">
<xsl:variable name="pref" as="xs:string*" select="string-join(m[@type = 'base']/m, '')"/>
<xsl:variable name="referenced-gramGrp" select="key('gramGrp', (@n, @lemma))"/>
<xsl:variable name="gram" as="xs:string*" select="$referenced-gramGrp/string-join((iType/@value, mood/@value, tns/@value, subc/@value), '. ')"/>
<xsl:variable name="actor-affixes" as="xs:string*" select="$referenced-gramGrp/gramGrp/string-join((per/@value, gen/@value, number/@value), '')"/>
<!-- <xsl:variable name="referenced-re" select="key('re', (ancestor-or-self::w/@xml:id))" />
<xsl:variable name="trans" as="xs:string*" select="$referenced-re/string-join(following::re/sense, '')"/> -->
<li>
<xsl:value-of select="$pref"/>
<xsl:text>: </xsl:text>
<xsl:value-of select="$gram, $actor-affixes" separator=", "/>
<xsl:text>. </xsl:text>Trans.
<!-- <xsl:value-of select="$trans" separator=". "/> -->
</li>
</xsl:for-each></ul>
</xsl:template>
<xsl:template match="gramGrp"/>
<!-- <xsl:template match="re"/> -->
</xsl:stylesheet>
输出:
<h3>mḫṣ</h3>
Mean.: to fight, to destroy.
<ul>
<li>tmtḫṣ: Gt. ind. imperf. trans, 2msg, 3fsg. Trans.
<!-- '$trans'-->
</li>
<li>tmḫṣ: D. ind. perf. trans, 2msg, 3fsg. Trans.
<!-- $trans' -->
</li>
</ul>
很遗憾,$trans
没有输出。我错了什么?
可以在此处找到更新版本:http://xsltfiddle.liberty-development.net/3Nqn5Y4
提前感谢您对xsl
新手的支持。
有两种方法可以回答这样的问题:(a) 指出您的代码有什么问题,以及 (b) 提供可行的解决方案。我要做(a);也许其他人会做 (b)。
这里有一些非常可怕的代码。先说临界区:
<xsl:if test="$gram = preceding-sibling::node()/$gram">
<xsl:value-of select="$gram"/>
</xsl:if>
在“/”右侧使用变量引用确实没有意义。事实上,使用任何其值不依赖于上下文项的表达式是没有意义的。 X/$gram
给你一个包含 N 次出现的 $gram
的序列(其中 N 是 X 的大小),并且由于所有这些都等于 $gram
,你的条件将始终为真。我不知道这段代码试图实现什么。
这里还有其他一些没有意义的东西。
<xsl:choose>
<xsl:when test="."><xsl:text>-</xsl:text></xsl:when>
<xsl:otherwise/>
</xsl:choose>
从“.”开始是一个节点,它的有效布尔值永远为真,所以这段代码等价于
<xsl:text>-</xsl:text>
现在:
<xsl:variable name="str1">
<xsl:value-of select="
current()[not != c[@type['infix']]] |node()"/>
</xsl:variable>
<xsl:value-of select="
translate(normalize-space($str1), ' ', '-')"/>
首先,构造
<xsl:variable name="V"><xsl:value-of select="X"/></xsl:variable>
几乎总是应该重写为
<xsl:variable name="V" select="X"/>
其次,此处的关键字 "not" 表示 "child::not" - 它正在寻找名为 "not" 的元素。这是故意的吗?
最后,current()
是一个 m
元素,源中的 m
元素只有一个文本节点子节点。将一个元素(受条件限制)和它的子文本节点合并,然后形成结果的字符串值,这似乎是一个非常奇怪的操作,很难想象它试图实现什么。
我想你想将变量移动到一个模板或 for-each 中,并使用正确的上下文节点,你想用一个键引用语法部分,这是一个 XSLT 3 样式表(可以是 运行 使用 Saxon 9.8 任何版本或更早的 PE 或 EE 版本和 Altova 2017 或 2018)尝试这样做:
<?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"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="xs math map array"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="gramGrp" match="gramGrp[@n and @ana]" composite="yes" use="@n, substring(@ana, 2)"/>
<xsl:template match="w[@n | @lemma]">
<ul>
<xsl:variable name="pref" as="xs:string" select="string-join(m[@type = 'base']/m, '')"/>
<xsl:variable name="referenced-gramGrp" select="key('gramGrp', (@n, @lemma))"/>
<xsl:variable name="gram" as="xs:string*" select="$referenced-gramGrp/string-join((iType/@value, mood/@value, tns/@value, subc/@value), '. ')"/>
<xsl:variable name="actor-affixes" as="xs:string*" select="$referenced-gramGrp/gramGrp/string-join((per/@value, gen/@value, number/@value), '')"/>
<li>
<xsl:value-of select="$pref" separator="-"/>
<xsl:text>: </xsl:text>
<xsl:value-of select="$gram, $actor-affixes" separator=", "/>
</li>
</ul>
</xsl:template>
<xsl:template match="gramGrp"/>
</xsl:stylesheet>
在http://xsltfiddle.liberty-development.net/jyyiVhf可以看到结果是
<root>
<ul><li>tmtḫṣ: Gt. ind. imperf. trans, 2msg, 3fsg</li></ul>
<ul><li>tmḫṣ: D. ind. perf. trans, 2msg, 3fsg</li></ul>
</root>
您需要添加代码,将 tmtḫṣ
之类的字符串分解为组件,因为我无法弄清楚它是如何工作的。
至于另一个键的编辑问题,不清楚你想select哪个值来形成键作为[=16=中的re
元素] 属性有一个 ID 列表。假设您只想使用第一个 id 作为键值,您可以使用
<xsl:key name="re" match="re[@n and @ana]" composite="yes" use="@n, tokenize(@ana, '\s+')[1]!substring(., 2)" />
然后
<xsl:variable name="referenced-re" select="key('re', (@n, @xml:id))" />
应该为您的示例数据找到一个 re
元素。