1

我有以下xml:

<root>    
<rdf:RDF 
   ....
   ....>
  <skos:Concept rdf:about="http://aims.fao.org/skosmos/agrovoc/en/page/c_26321">
    <skos:prefLabel xml:lang="fa">آبیس ماریزی‌ای&lt;/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 是一个广义术语 (),而松科是一个狭义术语 ()

我有以下 xslt:

<xsl:template match="root">
  <xsl:for-each select="rdf:RDF">
  <xsl:text>START HERE</xsl:text>
  <xsl:text>&#13;&#10;</xsl:text>
  <xsl:apply-templates select="skos:Concept" />
  <xsl:text>&#13;&#10;</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>&#13;&#10;</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>&#13;&#10;</xsl:text>
  </xsl:if>
</xsl:template> 
  ....

使用这个特定的模板,只有一个正在处理,后一个。我该如何进行这个迭代?处理两者 - 更广泛和更窄。

提前致谢!

4

3 回答 3

1

如果有两个模板完全匹配具有相同优先级的相同节点,则会被认为是错误的。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:chooseinside 是否需要不同的处理。

<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>&#13;&#10;</xsl:text>
  </xsl:if>
</xsl:template> 

xsl:if如果您可以同时使用“更广泛”和“更窄”的语句,请切换到使用两个语句skos:Concept

于 2015-07-27T09:45:20.657 回答
0

改变

 <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>&#13;&#10;</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>&#13;&#10;</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>&#13;&#10;</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>&#13;&#10;</xsl:text>
</xsl:template> 
于 2015-07-27T09:45:31.940 回答
0

谢谢你。我只是把我的情况过于复杂了。这对我来说是一个学习 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>&#13;&#10;</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>&#13;&#10;</xsl:text>
   </xsl:when>
  </xsl:choose>
 </xsl:template> 
于 2015-07-27T12:53:48.337 回答