复制基于另一个属性的 XSLT 属性
Copy over an XSLT attribute based on another attribute
在我看来,key
这应该是一件容易的事,但我正在努力。
我有两个 XML 文件,其中包含 <w>
个元素,其中包含 <m>
个元素。
它们都有一个 @corresp
属性和一个 @sameAs
属性,但是其中一个文件缺少一些 @sameAs
属性。
我想将缺少的 @sameAs
属性从一个文件复制到另一个文件,假设 @sameAs
值与 @corresp
属性的值配对(它们是English/Spanish 翻译)。
如果 @sameAs
的值已经存在,我不应该覆盖它。
@sameAs
- @corresp
对在 m
和 w
中均有效。
输入文件如下所示:
<p>
<w pos="N" corresp="house" sameAs="casa/ruca"><m corresp="house" sameAs="casa" type="root">ruca</m></w>
<w pos="N" corresp="man"><m corresp="man" type="root">wentru</m></w>
<w pos="AJ" corresp="bad"><m corresp="bad" type="root">weda</m></w>
<w pos="N" corresp="query"><m corresp="stone/rock" sameAs="piedra/roca" type="root">cura</m><m corresp="instrumental" type="suffix">we</m></w>
</p>
输出应该是:
<p>
<w pos="N" corresp="house" sameAs="casa/ruca"><m corresp="house" sameAs="casa" type="root">ruca</m></w>
<w pos="N" corresp="man" sameAs="hombre"><m corresp="man" sameAs="hombre" type="root">wentru</m></w>
<w pos="AJ" corresp="bad" sameAs="malo(a)"><m corresp="bad" type="root" sameAs="malo(a)">weda</m></w>
<w pos="N" corresp="query"><m corresp="stone/rock" sameAs="piedra/roca" type="root">kura</m><m corresp="instrumental" type="suffix">we</m></w>
</p>
查找文件如下所示:
<p>
<w pos="N" corresp="house" sameAs="casa"><m corresp="house" sameAs="casa" type="root">ruka</m></w>
<w pos="N" corresp="dog" sameAs="perro"><m corresp="dog" sameAs="perro" type="root">txewa</m></w>
<w pos="N" corresp="man" sameAs="hombre"><m corresp="man" sameAs="hombre" type="root">wentro</m></w>
<w pos="AJ" corresp="bad" sameAs="malo(a)"><m corresp="bad" type="root" sameAs="malo(a)">wesha</m></w>
<w pos="N" corresp="query"><m corresp="stone/rock" sameAs="piedra/roca" type="root">kura</m><m corresp="instrumental" type="suffix">we</m></w>
</p>
我尝试了以下方法,但无济于事:
<?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('lookup.xml')"/>
<xsl:key name="ref" match="w/@sameAs|node()" composite="yes" use="@corresp"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="w/@sameAs|node()[key('ref', (@corresp, @sameAs), $lookup-doc)]">
<xsl:copy-of select="w/@sameAs|node()[key('ref', (@corresp, @sameAs), $lookup-doc)]"/>
</xsl:template>
</xsl:stylesheet>
有什么建议吗?
复制 sameAs
属性(如果它们不存在)的文本描述听起来像
<xsl:key name="ref" match="w" use="@corresp"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="w[not(@sameAs)][key('ref', @corresp, $lookup-doc)] | m[not(@sameAs)][key('ref', @corresp, $lookup-doc)]">
<xsl:copy>
<xsl:apply-templates select="@*, key('ref', @corresp, $lookup-doc)/@sameAs, node()"/>
</xsl:copy>
</xsl:template>
在我看来,key
这应该是一件容易的事,但我正在努力。
我有两个 XML 文件,其中包含 <w>
个元素,其中包含 <m>
个元素。
它们都有一个 @corresp
属性和一个 @sameAs
属性,但是其中一个文件缺少一些 @sameAs
属性。
我想将缺少的 @sameAs
属性从一个文件复制到另一个文件,假设 @sameAs
值与 @corresp
属性的值配对(它们是English/Spanish 翻译)。
如果 @sameAs
的值已经存在,我不应该覆盖它。
@sameAs
- @corresp
对在 m
和 w
中均有效。
输入文件如下所示:
<p>
<w pos="N" corresp="house" sameAs="casa/ruca"><m corresp="house" sameAs="casa" type="root">ruca</m></w>
<w pos="N" corresp="man"><m corresp="man" type="root">wentru</m></w>
<w pos="AJ" corresp="bad"><m corresp="bad" type="root">weda</m></w>
<w pos="N" corresp="query"><m corresp="stone/rock" sameAs="piedra/roca" type="root">cura</m><m corresp="instrumental" type="suffix">we</m></w>
</p>
输出应该是:
<p>
<w pos="N" corresp="house" sameAs="casa/ruca"><m corresp="house" sameAs="casa" type="root">ruca</m></w>
<w pos="N" corresp="man" sameAs="hombre"><m corresp="man" sameAs="hombre" type="root">wentru</m></w>
<w pos="AJ" corresp="bad" sameAs="malo(a)"><m corresp="bad" type="root" sameAs="malo(a)">weda</m></w>
<w pos="N" corresp="query"><m corresp="stone/rock" sameAs="piedra/roca" type="root">kura</m><m corresp="instrumental" type="suffix">we</m></w>
</p>
查找文件如下所示:
<p>
<w pos="N" corresp="house" sameAs="casa"><m corresp="house" sameAs="casa" type="root">ruka</m></w>
<w pos="N" corresp="dog" sameAs="perro"><m corresp="dog" sameAs="perro" type="root">txewa</m></w>
<w pos="N" corresp="man" sameAs="hombre"><m corresp="man" sameAs="hombre" type="root">wentro</m></w>
<w pos="AJ" corresp="bad" sameAs="malo(a)"><m corresp="bad" type="root" sameAs="malo(a)">wesha</m></w>
<w pos="N" corresp="query"><m corresp="stone/rock" sameAs="piedra/roca" type="root">kura</m><m corresp="instrumental" type="suffix">we</m></w>
</p>
我尝试了以下方法,但无济于事:
<?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('lookup.xml')"/>
<xsl:key name="ref" match="w/@sameAs|node()" composite="yes" use="@corresp"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="w/@sameAs|node()[key('ref', (@corresp, @sameAs), $lookup-doc)]">
<xsl:copy-of select="w/@sameAs|node()[key('ref', (@corresp, @sameAs), $lookup-doc)]"/>
</xsl:template>
</xsl:stylesheet>
有什么建议吗?
复制 sameAs
属性(如果它们不存在)的文本描述听起来像
<xsl:key name="ref" match="w" use="@corresp"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="w[not(@sameAs)][key('ref', @corresp, $lookup-doc)] | m[not(@sameAs)][key('ref', @corresp, $lookup-doc)]">
<xsl:copy>
<xsl:apply-templates select="@*, key('ref', @corresp, $lookup-doc)/@sameAs, node()"/>
</xsl:copy>
</xsl:template>