XSLT - foreach和递增属性名称的问题

时间:2010-01-19 21:19:21

标签: xslt

我正在使用XSLT并想转换它:

<attr>
    <header name="UpdateInformation1">
        <detail name="info">blah</detail>
    </header> 
    <header name="UpdateInformation2">
        <detail name="info">blah2</detail>
    </header> 
...other headers with different names...
</attr>

对此:

<UpdateInformation>
   <info>blah</info>
</UpdateInformation>
<UpdateInformation>
   <info>blah2</info>
</UpdateInformation>
...

我一直试图用foreach做到这一点,但我没有取得多大成功。这是我目前所拥有的,但通配符在这种情况下不起作用:

*错误*

<xsl:for-each select="attr/header[@name='UpdateInformation*']">
    <UpdateInformation>
    <Info>
          <xsl:value-of select="detail[@name='info']"/>
        </info>
    </UpdateInformation>
</xsl:for-each>

*错误*

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:4)

使用类似的东西:

<xsl:for-each select="attr/header[starts-with(@name, 'UpdateInformation')]">
    <UpdateInformation>
        <Info>
            <xsl:value-of select="detail[@name='info']"/>
        </info>
    </UpdateInformation>
</xsl:for-each>

EDITED:修改了每个评论的XPath表达式(如下)。

答案 1 :(得分:2)

使用xsl:for-each元素执行此操作:

<xsl:for-each select="header[starts-with(@name, 'UpdateInformation')]">
 <UpdateInformation>
  <Info>
   <xsl:value-of select="detail"/>
  </info>
 </UpdateInformation>
</xsl:for-each>

在xslt中使用xsl:template将是更好的方法,因为这是它的优势:

<xsl:template match="header[starts-with(@name, 'UpdateInformation')]">
 <UpdateInformation>
  <Info>
   <xsl:value-of select="detail"/>
  </info>
 </UpdateInformation>
</xsl:template>