xslt 应用具有相同父节点的模板
xslt apply templates with same parent node
我有以下 xml:
<root>
<rdf:RDF
....
....>
<skos:Concept rdf:about="http://aims.fao.org/skosmos/agrovoc/en/page/c_26321">
<skos:prefLabel xml:lang="fa">آبیس ماریزیای</skos:prefLabel>
....
<skos:prefLabel xml:lang="en">Abies mariesii</skos:prefLabel>
<skos:broader rdf:resource="http://aims.fao.org/skosmos/agrovoc/en/page/c_10"/>
</skos:Concept>
<skos:Concept rdf:about="http://aims.fao.org/aos/agrovoc/c_5886">
<skos:prefLabel xml:lang="tr">Pinaceae</skos:prefLabel>
....
<skos:prefLabel xml:lang="en">Pinaceae</skos:prefLabel>
....
<skos:narrower rdf:resource="http://aims.fao.org/aos/agrovoc/c_10"/>
</skos:Concept>
请注意 skos:Concept 是 skos:prefLabel 的父节点,其值为 Abies mariesii 和 Pinaceae。 Abies mariesii 在这种情况下是一个更广泛的术语 () 而 Pinaceae 是一个更窄的术语 ()
我有以下 xslt:
<xsl:template match="root">
<xsl:for-each select="rdf:RDF">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="skos:Concept" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:if test="skos:broader">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=301 \$abroader$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:if test="skos:narrower">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=302 \$anarrower$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
....
对于这个特定的模板,只有一个正在处理,即后一个。我该如何进行这次迭代?处理两者 - 更广泛和更狭窄。
提前致谢!
有两个模板完全匹配具有相同优先级的相同节点被认为是错误的。 XSLT 处理器可以标记错误,或者忽略除最后一个匹配模板之外的所有模板。 (参见 http://www.w3.org/TR/xslt#conflict)
您需要做的是将 xsl:if
测试移出模板主体,使其成为模板匹配本身的一部分。
<xsl:template match="skos:Concept[skos:broader]">
...
</xsl:template>
<xsl:template match="skos:Concept[skos:narrower]">
...
</xsl:template>
请注意,如果 skos:Concept
同时存在 "broader" 和 "narrower" 元素,这仍然会失败,因为这两个模板将再次匹配同一个节点。
或者,无论是否需要不同的处理,只需使用xsl:choose
将两个模板合并为一个。
<xsl:template match="skos:Concept">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:choose>
<xsl:when test="skos:broader">
<xsl:text>=301 \$abroader$b</xsl:text>
</xsl:when>
<xsl:when test="skos:narrower">
<xsl:text>=302 \$anarrower$b</xsl:text>
</xsl:when>
<xsl:value-of select="skos:prefLabel[@xml:lang='en']" />
<xsl:text>$c</xsl:text>
<xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
如果可以在一个 skos:Concept
中同时包含 "broader" 和 "narrower",请切换到使用两个 xsl:if
语句
改变
<xsl:template match="skos:Concept">
<xsl:if test="skos:broader">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=301 \$abroader$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:if test="skos:narrower">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=302 \$anarrower$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
至
<xsl:template match="skos:Concept[skos:broader]">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=301 \$abroader$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="skos:Concept[skos:narrower]">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=302 \$anarrower$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:template>
谢谢。我只是把我的情况复杂化了。这是我使用 XSLT 的学习过程。干杯!这是最后一个:
<xsl:template match="skos:Concept">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:choose>
<xsl:when test="skos:broader">
<xsl:text>=301 \$abroader$b</xsl:text>
<xsl:value-of select="skos:prefLabel[@xml:lang='en']" />
<xsl:text>$c</xsl:text>
<xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:when>
<xsl:when test="skos:narrower">
<xsl:text>=302 \$anarrower$b</xsl:text>
<xsl:value-of select="skos:prefLabel[@xml:lang='en']" />
<xsl:text>$c</xsl:text>
<xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:when>
</xsl:choose>
</xsl:template>
我有以下 xml:
<root>
<rdf:RDF
....
....>
<skos:Concept rdf:about="http://aims.fao.org/skosmos/agrovoc/en/page/c_26321">
<skos:prefLabel xml:lang="fa">آبیس ماریزیای</skos:prefLabel>
....
<skos:prefLabel xml:lang="en">Abies mariesii</skos:prefLabel>
<skos:broader rdf:resource="http://aims.fao.org/skosmos/agrovoc/en/page/c_10"/>
</skos:Concept>
<skos:Concept rdf:about="http://aims.fao.org/aos/agrovoc/c_5886">
<skos:prefLabel xml:lang="tr">Pinaceae</skos:prefLabel>
....
<skos:prefLabel xml:lang="en">Pinaceae</skos:prefLabel>
....
<skos:narrower rdf:resource="http://aims.fao.org/aos/agrovoc/c_10"/>
</skos:Concept>
请注意 skos:Concept 是 skos:prefLabel 的父节点,其值为 Abies mariesii 和 Pinaceae。 Abies mariesii 在这种情况下是一个更广泛的术语 () 而 Pinaceae 是一个更窄的术语 ()
我有以下 xslt:
<xsl:template match="root">
<xsl:for-each select="rdf:RDF">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="skos:Concept" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:if test="skos:broader">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=301 \$abroader$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:if test="skos:narrower">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=302 \$anarrower$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
....
对于这个特定的模板,只有一个正在处理,即后一个。我该如何进行这次迭代?处理两者 - 更广泛和更狭窄。
提前致谢!
有两个模板完全匹配具有相同优先级的相同节点被认为是错误的。 XSLT 处理器可以标记错误,或者忽略除最后一个匹配模板之外的所有模板。 (参见 http://www.w3.org/TR/xslt#conflict)
您需要做的是将 xsl:if
测试移出模板主体,使其成为模板匹配本身的一部分。
<xsl:template match="skos:Concept[skos:broader]">
...
</xsl:template>
<xsl:template match="skos:Concept[skos:narrower]">
...
</xsl:template>
请注意,如果 skos:Concept
同时存在 "broader" 和 "narrower" 元素,这仍然会失败,因为这两个模板将再次匹配同一个节点。
或者,无论是否需要不同的处理,只需使用xsl:choose
将两个模板合并为一个。
<xsl:template match="skos:Concept">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:choose>
<xsl:when test="skos:broader">
<xsl:text>=301 \$abroader$b</xsl:text>
</xsl:when>
<xsl:when test="skos:narrower">
<xsl:text>=302 \$anarrower$b</xsl:text>
</xsl:when>
<xsl:value-of select="skos:prefLabel[@xml:lang='en']" />
<xsl:text>$c</xsl:text>
<xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
如果可以在一个 skos:Concept
xsl:if
语句
改变
<xsl:template match="skos:Concept">
<xsl:if test="skos:broader">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=301 \$abroader$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:if test="skos:narrower">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=302 \$anarrower$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
至
<xsl:template match="skos:Concept[skos:broader]">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=301 \$abroader$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="skos:Concept[skos:narrower]">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:text>=302 \$anarrower$b</xsl:text><xsl:value-of select="skos:prefLabel[@xml:lang='en']" /><xsl:text>$c</xsl:text><xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:template>
谢谢。我只是把我的情况复杂化了。这是我使用 XSLT 的学习过程。干杯!这是最后一个:
<xsl:template match="skos:Concept">
<xsl:for-each select="skos:prefLabel|skos:Concept" />
<xsl:choose>
<xsl:when test="skos:broader">
<xsl:text>=301 \$abroader$b</xsl:text>
<xsl:value-of select="skos:prefLabel[@xml:lang='en']" />
<xsl:text>$c</xsl:text>
<xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:when>
<xsl:when test="skos:narrower">
<xsl:text>=302 \$anarrower$b</xsl:text>
<xsl:value-of select="skos:prefLabel[@xml:lang='en']" />
<xsl:text>$c</xsl:text>
<xsl:value-of select="./@rdf:about" />
<xsl:text> </xsl:text>
</xsl:when>
</xsl:choose>
</xsl:template>