0

私は次のxmlに取り組んでいます:

<?xml version="1.0" encoding="utf-8" ?>
 <root>
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     .....
     xmlns:dc="http://purl.org/dc/terms/">

  <skos:Concept rdf:about="http://aims.fao.org/aos/agrovoc/c_26321">
     .....
   <skos:prefLabel xml:lang="en">Abies mariesii</skos:prefLabel>
   <skos:broader rdf:resource="http://aims.fao.org/aos/agrovoc/c_10"/>
  </skos:Concept>

  <skos:Concept rdf:about="http://aims.fao.org/aos/agrovoc/c_33272">
     .....
   <skos:prefLabel xml:lang="en">Abies numidica</skos:prefLabel>
   <skos:broader rdf:resource="http://aims.fao.org/aos/agrovoc/c_10"/>
  </skos:Concept>

     .....

  <skos:Concept rdf:about="http://aims.fao.org/aos/agrovoc/c_5886">
     .....
   <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:narrower rdf:resource="http://aims.fao.org/skosmos/agrovoc/en/page/c_1322232213779"/>
   <skos:narrower rdf:resource="http://aims.fao.org/skosmos/agrovoc/en/page/c_19"/>
     .....
   <skos:prefLabel xml:lang="en">Abies</skos:prefLabel>
     .....
   <skos:closeMatch>

     .....

 </rdf:RDF>

xml 全体には、http: //128.199.159.143/merged-file.xmlからアクセスできます。

そして、次の XSLT があります ( xslt get element value based on attribute which is referenced in another node tree に基づく) ここに:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   .....
 xmlns:void="http://rdfs.org/ns/void#">
 <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
 <xsl:key name="concepts-by-about" match="//skos:Concept" use="@rdf:about" />

  <xsl:template match="root">
   <xsl:for-each select="rdf:RDF">
   <xsl:text>START HERE</xsl:text>
   <xsl:text>&#13;&#10;</xsl:text>
   <xsl:text>=LDR  00000nam  2200000Ia 4500</xsl:text>
   <xsl:text>&#13;&#10;</xsl:text>
   <xsl:apply-templates select="skos:Concept/skos:broader" />
   <xsl:text>&#13;&#10;</xsl:text>
   <xsl:apply-templates select="skos:Concept/skos:narrower" />
   <xsl:text>&#13;&#10;</xsl:text>
   </xsl:for-each>
  </xsl:template>

  <xsl:template match="//skos:broader[key('concepts-by-about', @rdf:resource)]">       
   <xsl:text>=301  \\$abroader$b</xsl:text><xsl:value-of select="key('concepts-by-about', @rdf:resource)/skos:prefLabel[@xml:lang='en']" />
   <xsl:text>$c</xsl:text>
   <xsl:value-of select="./@rdf:resource" />
   <xsl:text>&#13;&#10;</xsl:text>   
  </xsl:template>           

  <xsl:template match="text()" />

  <xsl:template match="//skos:narrower[key('concepts-by-about', @rdf:resource)]">       
   <xsl:text>=302  \\$anarrower$b</xsl:text><xsl:value-of select="key('concepts-by-about', @rdf:resource)/skos:prefLabel[@xml:lang='en']" />
   <xsl:text>$c</xsl:text>
   <xsl:value-of select="./@rdf:resource" />
   <xsl:text>&#13;&#10;</xsl:text>   
  </xsl:template>           

  <xsl:template match="text()" />

  <xsl:template match="skos:Concept/skos:narrower/skos:Concept/skos:prefLabel[@xml:lang='en']">
   <xsl:text>=302  \\$anarrower$b</xsl:text><xsl:value-of select="." />
   <xsl:text>$c</xsl:text>
   <xsl:value-of select="../@rdf:about" />
   <xsl:text>&#13;&#10;</xsl:text>
  </xsl:template>

 </xsl:stylesheet>

この xslt を使用すると、次のようになります。

START HERE
=LDR  00000nam  2200000Ia 4500
=301  \\$abroader$bAbies$chttp://aims.fao.org/aos/agrovoc/c_10
=301  \\$abroader$bAbies$chttp://aims.fao.org/aos/agrovoc/c_10
  (more =301  \\$abroader$bAbies$chttp://aims.fao.org/aos/agrovoc/c_10) ...
=301  \\$abroader$bPinaceae$chttp://aims.fao.org/aos/agrovoc/c_5886

http://aims.fao.org/skosmos/agrovoc/en/page/c_10マツ科がより広い概念であることに基づいて、xmlで私が望んでいたものだからです。ただし、「Abies」は数回繰り返されるため、これらの重複を削除して別の値として出力するにはどうすればよいですか。

=400  \\$apreferredterm$bAbies$chttp://aims.fao.org/aos/agrovoc/c_10
4

1 に答える 1

1

参照されているスタイルシートを見てみましたが、次の行があります。

<xsl:template match="//skos:broader[key('concepts-by-about', @rdf:resource)]">

キーはグローバルであり、キーに一致するノードが少なくとも 1 つあるため、構造[key(...)]は常に true になります (述語では、ノードと一致する場合は「true」と見なされます)。任意のレベルで次のことを試してみると、これを自分で確認できます。

<xsl:value-of select="count(//skos:broader[key('concepts-by-about', @rdf:resource)])" />

51 個のノードが一致することが示されます。おそらくあなたの意図ではありません。

現在のノードの属性と の属性に一致skos:broaderする親 (または先祖) を持つ要素を実際に一致させたいようです。次のように実行できます。@rdf-resource@rdf:aboutskos:Concept

<xsl:template
    match="skos:broader[@rdf:resource = ancestor::skos:Concept/@rdf:about]">

これを変更した後、出力には次のいずれかのみが表示されます。

=301  \\$abroader$bAbies$chttp://aims.fao.org/aos/agrovoc/c_10

次に、そのテンプレート内で次のことを行います。

<xsl:value-of
    select="key('concepts-by-about', @rdf:resource)/skos:prefLabel[@xml:lang = 'en']" />

これは、キーに一致する最初のグローバル値を返します。繰り返しますが、実際には祖先skos:Conceptがここに必要なように見えますが、私は推測しています. もしそうなら、それは次のようになるはずです(@rdf:aboutすでに一致していることはわかっているので、 の一致を無視します):

<xsl:value-of select="ancestor::skos:Concept/skos:prefLabel[@xml:lang = 'en']" />

さらに、 で始まる一致パターンがある場合がいくつかありますが//、これは効果がありません。これは、「ルート、任意のノード、任意のレベルから始まり、それに続くものと一致する」ことを意味します。しかし、いずれにせよ、パターンはすでにグローバルであるため、そのパターンに遭遇するたびに高価なルックアップを実行するようプロセッサに要求することを除いて、何の効果もありません。これは、キーと一部の一致するテンプレートに当てはまります。

キー機能の使用は、あなたが達成しようとしていることには必要ではないと思いますが、あなたの要件の幅を完全には理解していないことを認めなければなりません.

于 2015-08-23T10:40:36.000 に答える