假设 XSLT 3.0(当前版本的 XMLSpy 支持)您可以使用以下内容,假设您要操作的文档是主要输入,并且另一个文档的 URI 设置为参数cat-uri
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:param name="cat-uri" as="xs:string" select="'cat.xml'"/>
<xsl:param name="new" as="xs:string" select="'inserted keyword'"/>
<xsl:param name="word-list" as="xs:string*" select="'specific1', 'specific2'"/>
<xsl:param name="cat-doc" select="doc($cat-uri)"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="match" match="cat" use="some $word in $word-list satisfies contains(@catid, $word)"/>
<xsl:key name="ref" match="prod[@prod-id]/display-name" use="../@prod-id"/>
<xsl:variable name="pids" select="key('match', true(), $cat-doc)/@pid"/>
<xsl:template match="key('ref', $pids)/text()">
<xsl:value-of select="$new || ' ' || ."/>
</xsl:template>
</xsl:stylesheet>
至于您更改的输入,您将不得不调整键,因此要匹配子元素值cat
上的元素,parent
您可以声明一个键<xsl:key name="cat-match" match="cat" use="parent"/>
,然后key('cat-match', $word-list, $cat-doc)/@catid
为我们提供我们需要引用的catid
属性值。cat-assign
为此,我们可以定义另一个键<xsl:key name="cat-assign" match="cat-assign" use="@catid"/>
,然后key('cat-assign', key('cat-match', $word-list, $cat-doc)/@catid, $cat-doc)/@pid
为我们提供值以引用prod
主输入中的元素。其余不变:
<?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"
version="3.0">
<xsl:param name="cat-uri" as="xs:string" select="'cat.xml'"/>
<xsl:param name="new" as="xs:string" select="'inserted keyword'"/>
<xsl:param name="word-list" as="xs:string*" select="'specific1', 'specific2'"/>
<xsl:param name="cat-doc" select="doc($cat-uri)"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="cat-match" match="cat" use="parent"/>
<xsl:key name="cat-assign" match="cat-assign" use="@catid"/>
<xsl:key name="ref" match="prod[@prod-id]/display-name" use="../@prod-id"/>
<xsl:variable name="pids" select="key('cat-assign', key('cat-match', $word-list, $cat-doc)/@catid, $cat-doc)/@pid"/>
<xsl:template match="key('ref', $pids)/text()">
<xsl:value-of select="$new || ' ' || ."/>
</xsl:template>
</xsl:stylesheet>
当我使用 Saxon 9.6 EE 在 Oxygen 中运行它时,针对 cat.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<cat catid="c1">
<parent>specific1</parent>
</cat>
<cat catid="c2">
<parent>specific1</parent>
</cat>
<cat catid="c3">
<parent>specific1</parent>
</cat>
<cat catid="c4">
<parent>specific2</parent>
</cat>
<cat catid="c5">
<parent>specific2</parent>
</cat>
<cat catid="c6">
<parent>specific3</parent>
</cat>
<cat-assign catid="c1" pid="x13"/>
<cat-assign catid="c1" pid="x1"/>
<cat-assign catid="c1" pid="x15"/>
<cat-assign catid="c2" pid="x24"/>
<cat-assign catid="c2" pid="x43"/>
<cat-assign catid="c2" pid="x44"/>
<cat-assign catid="c3" pid="x45"/>
<cat-assign catid="c4" pid="x27"/>
<cat-assign catid="c5" pid="x31"/>
<cat-assign catid="c5" pid="x2"/>
<cat-assign catid="c5" pid="x33"/>
<cat-assign catid="c5" pid="x34"/>
</root>
并且输入文档是
<?xml version="1.0" encoding="UTF-8"?>
<root>
<prod prod-id="x1">
<display-name xml:lang="x-default">some text</display-name>
</prod>
<prod prod-id="x2">
<display-name xml:lang="x-default">some more text</display-name>
</prod>
<prod prod-id="x5">
<display-name xml:lang="x-default">some text</display-name>
</prod>
</root>
结果是
<?xml version="1.0" encoding="UTF-8"?><root>
<prod prod-id="x1">
<display-name xml:lang="x-default">inserted keyword some text</display-name>
</prod>
<prod prod-id="x2">
<display-name xml:lang="x-default">inserted keyword some more text</display-name>
</prod>
<prod prod-id="x5">
<display-name xml:lang="x-default">some text</display-name>
</prod>
</root>