选择一组节点XSLT的最后一个匹配项

时间:2014-01-15 11:39:17

标签: xml xslt xslt-1.0

我需要找到一组价格的最后一次出现(总计)。 这些价格总是带有小数(。)

它们的文本值存储在节点中,它们被发现为最后一次出现的3个节点,它们都包含'。'

示例XML:

<?xml version="1.0" encoding="UTF-16"?>
<?xml-stylesheet type="text/xsl" href="XSLT.xsl"?>
<document xmlns="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<part1>
    <prices>
        <wd>3.1</wd>
        <wd>56.4</wd>
        <wd>134.4</wd>
    </prices>
    <prices2>
        <wd>1,330.2</wd>
        <wd>23.14</wd>
        <wd>124.7</wd>
    </prices2>
</part1>
</document>

我寻找最后一组的尝试如下。但是我无法将其编译,而是单独工作。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:ss="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd">
  <xsl:output method="text" />

 <xsl:template match="/"> 

<xsl:variable name="LastGroup" select="//ss:wd[(contains(.,'.') and (following::ss:wd[contains(.,'.')]) and (following::ss:wd[contains(.,'.')][2])][last()]"/>

<xsl:for-each select="$LastGroup">
    <xsl:value-of select="."/>
    <xsl:value-of select="following::ss:wd"/>
    <xsl:value-of select="following::ss:wd[2]"/>
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

我正在使用XSLT 1.0

1 个答案:

答案 0 :(得分:1)

如果您想严格遵循您所描述的算法,可以将变量声明为:

<xsl:variable name="LastGroup"
  select="(//ss:wd[contains(.,'.') and contains(following::ss:wd[1],'.') and contains(following::ss:wd[2],'.')])[last()]"/>

请注意,对于大文件来说这会很慢,尤其是因为您使用的是following::轴。如果这三个元素始终嵌入在示例中显示的同一父级中,则将following::替换为following-sibling::可以提高性能......用更具选择性的内容替换//ss:wd也应该有所帮助。