2015-05-14 2 views
0

я уверен, что я что-то просто не хватает здесь ...XSLT выбрать из вложенного элемента

Я не могу выбрать вложенный элемент XML с помощью трансформирующего XLST.

Вот XML-

<collection> 
<record> 
    <leader>01814nam a2200205Ia 4500</leader> 
    <controlfield tag="003">PSCA</controlfield> 
    <controlfield tag="005">20141201150951.0</controlfield> 
    <controlfield tag="008">131110s9999 xx   000 0 und d</controlfield> 
    <datafield tag="040" ind1=" " ind2=" "> 
    <subfield code="a">PSCA</subfield> 
    <subfield code="c">Calyx</subfield> 
    </datafield> 
    <datafield tag="110" ind1=" " ind2=" "> 
    <subfield code="9">76</subfield> 
    <subfield code="a">Children's Services Central</subfield> 
    </datafield> 
    <datafield tag="245" ind1="0" ind2="0"> 
    <subfield code="a">What's Pedagogy Anyway?</subfield> 
    <subfield code="b">Using pedagogical documentation to engage with the Early Years Learning Framework </subfield> 
    </datafield> 
</record> 
</collection 

нужно выбрать следующие данные:

/коллекция

/запись

/DataField

->/@ tag = '245'

---->/subfield/@ code = 'a'

Ожидаемый результат: «Что такое педагогика?»

Мой XLST выбрать этот узел/данных как таковой:

<xsl:for-each select="collection/record/datafield"> 
    <xsl:choose> 
     <xsl:when test="@tag=245"> 
      <xsl:choose> 
       <xsl:when test="/subfeild/@code=a"> 
        <xsl:value-of select="/subfeild"/> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:when> 
    </xsl:choose> 
</xsl:for-each> 

Я бегу это с помощью библиотеки LXML в Python, если это важно. Код компилируется и запускается без ошибок. Мой выход равен нулю.

Любые идеи? Спасибо заранее.

ответ

0

Вы можете захотеть изменить @code=a с @code='a', такие как:

<xsl:template match="/"> 
    <xsl:value-of select="collection/record/datafield[@tag=245]/subfield[@code='a']"/> 
</xsl:template> 

EDIT

Если вы настаиваете на иметь for-each петлю, смотрите ниже:

<xsl:template match="/"> 
    <xsl:for-each select="collection/record/datafield"> 
     <xsl:choose> 
      <xsl:when test="@tag=245"> 
       <xsl:value-of select="subfield[@code='a']"/> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:for-each> 
</xsl:template> 
+0

И вот оно! – bitsar

+0

Спасибо, Джоэл ..... очень ценим. – bitsar

+0

Хорошо, возможно, было слишком рано ...... Как я могу перебирать все «поля данных», используя для каждого вместо прямого выбора? – bitsar

0

Этот что мне нужно

<xsl:value-of select="collection/record/datafield[@tag=245]/subfield[@code='a']" /> 
<xsl:for-each select="collection/record"> 
    <xsl:value-of select="datafield[@tag=245]/subfield[@code='a']"/> 
</xsl:for-each> 

Я должен объяснить - мне нужно, чтобы в качестве предоставленного XML был фрагмент из более чем 500 сложных записей. Не этот экземпляр.

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