2015-08-10 5 views
1

Я работаю на следующий файл XML:XSLT интегрирование XSL, когда шаблон

<?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_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:prefLabel xml:lang="ar">شوح</skos:prefLabel> 
    <skos:prefLabel xml:lang="fa">آبیس</skos:prefLabel> 
       ...... 
    <skos:prefLabel xml:lang="es">Abies</skos:prefLabel> 
    <skos:prefLabel xml:lang="en">Abies</skos:prefLabel> 
    <skos:closeMatch> 
     .... 
</rdf:RDF> 
</root> 

я в состоянии получить значение узкого skosprefLabel XML: LANG = еп и шире skosprefLabel XML: LANG = ан с следующие шаблоны:

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

    <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> 
</xsl:stylesheet> 

с выше шаблон, я могу получить то, что я хотел, как показано ниже:

START HERE 
=LDR 00000nam 2200000Ia 4500 

=301 \\$abroader$bAbies mariesii$chttp://aims.fao.org/aos/agrovoc/c_26321 
=302 \\$anarrower$bPinaceae$chttp://aims.fao.org/aos/agrovoc/c_5886 

Вместе с тем, когда я добавляю ниже следующее в «когда шаблон» выше, после того, как «когда тест = SKOS: узкий» шаблон:

<xsl:template match="skos:Concept"> 
    <xsl:for-each select="skos:prefLabel"> 
    <xsl:choose> 
    <xsl:when test="following-sibling::skos:closeMatch"> 
    <xsl:text>=306 \\$aclosematch$b</xsl:text> 
    <xsl:value-of select="." /> 
    <xsl:text>&#13;&#10;</xsl:text> 
    </xsl:when> 

Проблема в том, что я не могу интегрировать выше шаблон, который я тестировал отдельно от полный шаблон, над которым я работаю. Я что-то упускаю? Или моя стратегия/шаблон правильный? Или, может быть, лучше использовать другой шаблон? Как skos: Concept/skos: prefLabel? или skos: Концепция/skos: prefLabel/skos: closeMatch? Для справки, весь xml находится здесь: 128.199.159.143/merged-file.xml. ТИА!

ответ

2

На мой взгляд, код XSLT, выполняющий <xsl:for-each select="..."><xsl:choose>..., обычно лучше написан как <xsl:apply-templates select="..."/>, а затем с шаблонами, соответствующими элементам с предикатами, например. <xsl:template match="sko:label[skos:broader]">.

+0

Спасибо, Мартин, я не очень часто вижу это в учебных пособиях xslt и xpath. Кажется, я туда направляюсь. Я пробовал это: = 301 \\ $ foreigner \t $ с \t schnydszch

Смежные вопросы