2015-06-17 3 views
0

У меня есть XML, как показано ниже:Как использовать регулярное выражение для xpath XML в xslt?

<pi:Additional_Information> 
<pi:Allocation_Cost_Center_1 > test value cost 1 </pi:Allocation_Cost_Center_1> 
<pi:Allocation_Cost_Center_2 > test value cost 2 </pi:Allocation_Cost_Center_2> 
<pi:Allocation_Cost_Center_3 > test value cost 3 </pi:Allocation_Cost_Center_2> 
<pi:Allocation_Cost_Center_4 > test value cost 4 </pi:Allocation_Cost_Center_2> 
<pi:Allocation_Region_1 >test value region 1</pi:Allocation_Region_1> 
<pi:Allocation_Region_2 >test value region 2</pi:Allocation_Region_2> 
<pi:Allocation_Region_3 >test value region 3</pi:Allocation_Region_3> 
<pi:Allocation_Region_4 >test value region 4</pi:Allocation_Region_4> 
<pi:Allocation_Location_1>Berlin</pi:Allocation_Location_1> 
<pi:Allocation_Location_2>Berlin</pi:Allocation_Location_2> 
<pi:Allocation_Location_3>Berlin</pi:Allocation_Location_3> 
<pi:Allocation_Location_4>Berlin</pi:Allocation_Location_4> 
</pi:Additional_Information> 

мне нужно перебрать все теги оканчивающихся на один в первом цикле, в следующем цикле все теги оканчивающиеся на 2 и так далее .....

Я использую XSLT 2.0. Ожидаемые результаты, как показано ниже:

(строка один)

тестовое значение стоимости 1 тестового значения области 1 Берлин

(строка два)

тестового значения стоимости 2 тестового значения области 2 Берлин

(строка три)

тестовое значение стоимости 3 тестового значения области 3 Берлин

(строка четыре)

тестовое значение стоит 4 тестового область значений 4 Берлина

Спасибо заранее.

+1

Ваш вопрос непонятен. Пожалуйста, опубликуйте ожидаемый результат вашего примера, и какова ваша трудность в его получении. - Обратите внимание, что вход, который вы показываете нам, не является хорошо сформированным XML-документом, префикс 'pi' не связан с пространством имен. –

+1

Какой плохой дизайн XML! Имена элементов никогда не должны содержать данные экземпляра, подобные этому. –

+0

Вы используете XSLT 1.0 или 2.0? Регулярные выражения недоступны в 1.0. –

ответ

0

В XSLT 2.0:

<xsl:template match="pi:Additional_Information"> 
    <xsl:for-each-group select="*" group-by="replace(name(), '[A-Za-z_]', '')"> 
    <loop index="{current-grouping-key()}"> 
     <xsl:apply-templates select="current-group()"/> 
    </loop> 
    </xsl:for-each-group> 
    </xsl:template> 
+0

Не должно быть: 'group-by =" replace (name(), '[A-Za-z_]', '') "'? –

+0

Спасибо, исправлено как предложено. –

1

Вот еще один способ, которым Вы могли бы смотреть на него:

<xsl:template match="/pi:Additional_Information"> 
    <xsl:variable name="nodes" select="*" /> 
    <xsl:variable name="rows" select="count($nodes) div 3" /> 
    <xsl:for-each select="0 to $rows - 1"> 
     <xsl:value-of select="$nodes[(position() - 1) mod $rows = current()]"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

Это предполагает, что всегда есть 3 типа узлов (и, следовательно, 3 значения в строке), и что они сортируются по типу и по строке.

В противном случае вы можете использовать:

<xsl:template match="pi:Additional_Information"> 
    <xsl:for-each-group select="*" group-by="tokenize(name(), '_')[last()]">   
     <xsl:value-of select="current-group()"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each-group> 
</xsl:template> 

Это группы узлов на то, что приходит после последнего подчеркивания в имени.