每个XSL - 从节点获取单个值

时间:2016-10-25 10:00:29

标签: xml xslt

大家好我有一个包含以下部分的xml文件:

<sml:inputs>
<sml:InputList>
      <sml:input name="instrument_A">
          <sml:ObservableProperty definition="instrument_A"/>
      </sml:input>
      <sml:input name="instrument_B">
          <sml:ObservableProperty definition="instrument_B"/>
      </sml:input>
      <sml:input name="instrument_C">
          <sml:ObservableProperty definition="instrument_C"/>
      </sml:input>
      <sml:input name="instrument_D">
          <sml:ObservableProperty definition="instrument_D"/>
      </sml:input>              
</sml:InputList>

我想做的是写一个XSL文件,它给出了以下输出:

 <gmd:keyword>
     <gco:CharacterString>instrument_A</gco:CharacterString>
 </gmd:keyword>
 <gmd:keyword>
     <gco:CharacterString>instrument_B</gco:CharacterString>
 </gmd:keyword>
 <gmd:keyword>
    <gco:CharacterString>instrument_C</gco:CharacterString>
 </gmd:keyword>
 <gmd:keyword>
     <gco:CharacterString>instrument_D</gco:CharacterString>
 </gmd:keyword>

我试过这个:

<xsl:for-each select="/sml:inputs/sml:InputList/sml:input">
    <xsl:value-of select="@name"/>

但我得到了以下错误结果:

<gmd:keyword>instrument_Ainstrument_Binstrument_Cinstrument_D</gmd:keyword>

请告诉我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您尚未在创建gmd:keyword元素的位置显示现有代码,但我猜您是在xsl:for-each之外进行的,因此它只会创建一次,并包含所有内容文字为一体。

您只需将其移至xsl:for-each

作为初学者,试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
        xmlns:sml="sml" xmlns:gmd="gmd" xmlns:gco="gco"
        exclude-result-prefixes="sml">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <gmd:ouptput>
            <xsl:for-each select="/sml:inputs/sml:InputList/sml:input">
                <gmd:keyword>
                    <gco:CharacterString>
                        <xsl:value-of select="@name"/>
                    </gco:CharacterString>
                </gmd:keyword>
            </xsl:for-each>
        </gmd:ouptput>
    </xsl:template>
</xsl:stylesheet>

请注意,您必须更新命名空间声明以符合您的实际要求,因为您未在问题中显示此内容。