XSL:针对密钥进行测试
XSL: test against key
我在一个文件 people.xml
中有一长串姓名(包括详细的履历)。这些人出现在另一个文件中的随机位置 corpus.xml
。他们是 'tied together' 和 @xml:id
.
因此在people.xml
文件中,有像
这样的条目
<person xml:id="john_foo"/>
<person xml:id="ann_foo"/>
<person xml:id="sally_foo"/>
...
并且在 corpus.xml
文件中,我们可以在 @nameref
下找到相同的 xml:ids(文档中的任何位置)
<corpus>
<p>
<persName nameref="#john_foo" role="a"/>
<persName nameref="#ann_foo" role="g"/>
<s>
<persName nameref="#john_foo" role="g"/>
</s>
</p>
<p>
<persName nameref="#sally_foo" role="a"/>
<d>
<persName nameref="#sally_foo" role="p"/>
</d>
</p>
...
<corpus>
我想测试(使用 XSL 3.0,Saxon)每个 people.xml//@xml:id
是否存在于 corpus.xml/corpus//persName/@nameref
中,但仅当 @role
匹配特定值时。在这种情况下,我只想 return a 'positive result' if @role="a"
我正在尝试使用按键来执行此操作,但它 return 没有任何作用:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:key name="namerefs" match="corpus" use=".//persName[@role='a']"/>
<xsl:param name="documt" select="doc('corpus.xml')"/>
<xsl:template match="person">
<!-- test if exists @xml:id + @role="a" -->
<xsl:if test="key($namerefs, concat('#',@xml:id) ,$documt")>if found, do something here</xsl:if>
</xsl:template>
</xsl:stylesheet>
我想我没有访问密钥中的正确节点?
非常感谢。
注意。针对各种拼写错误进行了更新
这个
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="persName" match="persName" use="substring-after(@nameref, '#')" />
<xsl:param name="corpusDoc" select="document('corpus.xml')"/>
<xsl:template match="/">
<xsl:apply-templates select="//person" />
</xsl:template>
<xsl:template match="person">
<xsl:if test="key('persName', @xml:id, $corpusDoc)[@role = 'a']">
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
产出
<person xml:id="john_foo"/>
<person xml:id="sally_foo"/>
您可以将谓词 [@role = 'a']
从 <xsl:if>
移动到 <xsl:key>
。那会起作用,但我认为不值得。
我在一个文件 people.xml
中有一长串姓名(包括详细的履历)。这些人出现在另一个文件中的随机位置 corpus.xml
。他们是 'tied together' 和 @xml:id
.
因此在people.xml
文件中,有像
<person xml:id="john_foo"/>
<person xml:id="ann_foo"/>
<person xml:id="sally_foo"/>
...
并且在 corpus.xml
文件中,我们可以在 @nameref
<corpus>
<p>
<persName nameref="#john_foo" role="a"/>
<persName nameref="#ann_foo" role="g"/>
<s>
<persName nameref="#john_foo" role="g"/>
</s>
</p>
<p>
<persName nameref="#sally_foo" role="a"/>
<d>
<persName nameref="#sally_foo" role="p"/>
</d>
</p>
...
<corpus>
我想测试(使用 XSL 3.0,Saxon)每个 people.xml//@xml:id
是否存在于 corpus.xml/corpus//persName/@nameref
中,但仅当 @role
匹配特定值时。在这种情况下,我只想 return a 'positive result' if @role="a"
我正在尝试使用按键来执行此操作,但它 return 没有任何作用:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:key name="namerefs" match="corpus" use=".//persName[@role='a']"/>
<xsl:param name="documt" select="doc('corpus.xml')"/>
<xsl:template match="person">
<!-- test if exists @xml:id + @role="a" -->
<xsl:if test="key($namerefs, concat('#',@xml:id) ,$documt")>if found, do something here</xsl:if>
</xsl:template>
</xsl:stylesheet>
我想我没有访问密钥中的正确节点?
非常感谢。
注意。针对各种拼写错误进行了更新
这个
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="persName" match="persName" use="substring-after(@nameref, '#')" />
<xsl:param name="corpusDoc" select="document('corpus.xml')"/>
<xsl:template match="/">
<xsl:apply-templates select="//person" />
</xsl:template>
<xsl:template match="person">
<xsl:if test="key('persName', @xml:id, $corpusDoc)[@role = 'a']">
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
产出
<person xml:id="john_foo"/>
<person xml:id="sally_foo"/>
您可以将谓词 [@role = 'a']
从 <xsl:if>
移动到 <xsl:key>
。那会起作用,但我认为不值得。