XSLT如何仅选择带有子元素的元素的值

时间:2018-02-21 10:23:18

标签: html xml xslt

我有这段代码,无法编辑它:

<elenco-treni>
<treno id='1'> Moderno
    <percorso>Terni - Spoleto</percorso>
    <tipo genere='locale'> aaa
        <fermata>Narni</fermata>
        <fermata informale='s'>Giano</fermata>
    </tipo>
</treno>

<treno id='5' codice='G140'> Jazz
    <percorso>Orte - Terontola</percorso>
    <tipo genere='regionale'>
        <fermata>Terni</fermata>
        <fermata>Spoleto</fermata>
        <fermata>Foligno</fermata>
        <fermata>Assisi</fermata>
        <fermata>Perugia</fermata>
    </tipo>
</treno>
</elenco-treni>

我遇到了一些问题:

1)当我选择&#34; elenco-treni&#34;,一切都不起作用

<xsl:for-each select="elenco-treni">
<xsl:value-of select="treno"/>

给我空白的结果。

2)我无法获得tipo的价值&#34; aaa&#34;

<xsl:for-each select="treno">
<xsl:value-of select="tipo"/>

给了我所有的&#34; tipo&#34;孩子及其价值。

1 个答案:

答案 0 :(得分:0)

这是设计糟糕的XML,因为它使用混合内容(具有文本节点和其他元素作为子元素的元素),其混合内容未被设计为使用。如果混合内容使用得当,xsl:value-of work的构造很好,但它们在这种输入上不能很好地工作。

当您处理设计糟糕的XML时,最好的方法是首先将其转换为更干净的东西。你可以在这里用一个包装元素中文本节点的转换来做到这一点:

<xsl:template match="treno/text()[normalize-space(.)]">
  <veicolo><xsl:value-of select="normalize-space(.)"/></veicolo>
</xsl:template>

这只需要包装非空白文本节点。