XSLT 将元素从一个文件复制到另一个匹配两个条件的文件

XSLT copy elements from one file to another matching two conditions

这里是非常基本的问题。 如果 <w> 匹配两个参数,我正在尝试编写一个 XSLT 将元素 (<w>) 复制到一个文件中(从另一个文件):

如果任一参数不匹配,则 <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)"/> 代替)。

或许您可以澄清哪个文档是“来源”,哪个文档是“目标”,并更详细地解释规则以及给出的示例匹配或不匹配的原因。