2014-01-15 3 views
0

Мне нужно найти последнее вхождение группы цен (которые являются итогами). Эти цены всегда будут иметь десятичный знак в них (.)Выберите последнее вхождение группы узлов XSLT

Их текстовые значения хранятся в узлах, и они находятся в качестве последнего вхождения из трех узлов, все из которых содержат «.»..

Пример 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

Если вы хотите строго следовать алгоритму, который вы описали вы можете объявить переменную как:

<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 на что-то более избирательное также должна помочь.

Смежные вопросы