这里很基本的问题。<w>
如果<w>
s在两个参数上匹配,我正在尝试编写XSLT以将元素()复制到文件中(从另一个文件中复制):
@lemma
必须在两个元素上都匹配,并且text()
必须匹配<m>
目标的第一个元素和<w>
源中的完整元素(即使它跨越数<m>
s个也是如此)。如果任何一个参数都不匹配,则该参数<w>
应保持不变。
这是要修改的示例文件。
<?xml version="1.0" encoding="UTF-8"?>
<text>
<w lemma="FishCake" corresp="1"><m baseForm="FishCake">FishCake</m></w>
<w lemma="FishCake" corresp="1"><m baseForm="FishCake">FishCake</m><m baseForm="FishCake">FishCake</m></w>
<w lemma="FishCake" corresp="1"><m baseForm="FishCake">FishCake</m><m baseForm="s">s</m></w>
<w lemma="FishCake" corresp="1"><m baseForm="FishC">FishC</m><m baseForm="ake">ake</m></w>
<w lemma="cat" corresp="1"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="1"><m baseForm="cat">cat</m></w>
<w lemma="dog" corresp="1"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="1"><m baseForm="dog">dog</m><m baseForm="cat">cat</m></w>
</text>
这是一个示例文件,其中包含要复制的元素(source.xml)
<?xml version="1.0" encoding="UTF-8"?>
<text>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
</text>
我希望代码能够产生:
<?xml version="1.0" encoding="UTF-8"?>
<text>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="FishCake" corresp="1"><m baseForm="FishCake">FishCake</m><m baseForm="s">s</m></w>
<w lemma="FishCake" corresp="1"><m baseForm="FishC">FishC</m><m baseForm="ake">ake</m></w>
<w lemma="cat" corresp="1"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="1"><m baseForm="cat">cat</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
</text>
我已经尝试了以下XSLT(尝试修改已经拥有的一些代码的糟糕尝试),但只能设法使其与 @lemma
<?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"
xpath-default-namespace="http://www.tei-c.org/ns/1.0"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="lookup-doc" select="document('source.xml')"/>
<xsl:key name="ref" match="*[@lemma|m[1]/text()]" use="@lemma|m[1]/text()"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:mode name="ref-copy" on-no-match="shallow-copy"/>
<xsl:template match="*[key('ref', @lemma|m[1]/text(), $lookup-doc)]">
<xsl:apply-templates select="key('ref', @lemma|m[1]/text(), $lookup-doc)" mode="ref-copy">
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
我得到的是:
<?xml version="1.0" encoding="UTF-8"?><text>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="cat" corresp="1"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
</text>
有小费吗?干杯!
我无法完全掌握规则,也无法尝试将其编写为键并使用它
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:param name="doc2">
<text>
<w lemma="FishCake" corresp="2"><m baseForm="Fish">Fish</m><m baseForm="Cake">Cake</m></w>
<w lemma="dog" corresp="2"><m baseForm="dog">dog</m></w>
</text>
</xsl:param>
<xsl:key name="ref" match="w" composite="yes" use="@lemma, ."/>
<xsl:template match="w[key('ref', (@lemma, m[1]), $doc2)]">
<xsl:copy-of select="key('ref', (@lemma, m[1]), $doc2)"/>
</xsl:template>
</xsl:stylesheet>
并不能完全给出你所描述的结果(第二个文档内嵌于示例的紧凑性和完整性,但是当然可以<xsl:param name="doc2" select="doc($lookup-doc)"/>
代替使用)。
也许你可以弄清楚哪个文档是“源”,哪个文档是“目标”,并更详细地解释规则,以及给出的示例为何匹配或不匹配。
嗨,马丁。非常感谢–这正是我一直在努力的工作–基本上是匹配的括号,并且普遍缺乏XSLT背景。确实,我可以看到我在那里使您感到困惑–我在回应中弄清楚了目标和来源。正如您的代码所预测的那样,第四个示例应该是一个匹配项。