XSLT从嵌套元素中选择

时间:2015-05-14 04:58:10

标签: python xml xslt

我确定我在这里错过了一些简单的事情......

我无法使用XLST转换选择嵌套的xml元素。

这是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

我需要选择以下数据:

/收集

/记录

/数据字段

- &GT; / @标记=&#39; 245&#39;

----&GT; /子场/ @代码=&#39;一个&#39;

我希望输出为: &#34;无论如何教育学?&#34;

我的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>

我在Python中使用lxml库来运行它,如果这很重要的话。 代码编译并运行没有错误。 我的输出为空。

有什么想法吗? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可能希望使用@code=a更改@code='a',例如:

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

修改

如果您坚持使用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>

答案 1 :(得分: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个复杂记录的片段。不是这一个例子。