Карта итерации с использованием XSLT - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь перебрать карту (ключ, пара значений) со значением в виде «xpath», используя XSLT. Но я не могу перебрать запись карты, используя xslt 2.0.

Карта:

<xsl:variable name="map">
 <entry key="Access">//DataService [@type ='PR_ACC']/ID</entry>
 <entry key="Transport">//DataService [@type ='PR_IB']/ID</entry>
 <entry key="CHE">//EquipmentService [@type ='PR_CPE']/ID</entry>
 </xsl:variable>

Цикличность:

<Id><xsl:value-of select="$map/entry[@key=ID/@schemeID]"/></Id>

xpath:

ID/@schemeID will return any one of (Access, Transport, CPE)

Пример входного XML:

<ID schemeID="CHE"></ID>
<Services>
       <DataService type ='PR_ACC'>
             <ID>12345<ID>
       </DataService>
       <DataService type ='PR_BCC'>
               <ID>12345<ID>  
      </DataService>
       <EquipmentService type =' PR_CPE  '>
                <ID>98765<ID>      
     </EquipmentService>
</Services>

Ожидаемый результат:

<Id> 98765 </Id>

Кто-нибудь, скажите мне, что мне не хватает, пожалуйста?

1 Ответ

0 голосов
/ 29 марта 2019

Предполагая, что XSLT 3 с поддержкой XPath 3.1 и поддержкой xsl:evaluate (как это предусмотрено в Saxon PE и EE начиная с 9.8 и более поздних версий), вы можете написать код, подобный

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:variable name="map" as="map(xs:string, xs:string)"
        select="map {
        'Access' : &quot;//DataService [@type ='PR_ACC']/ID&quot;,
        'Transport' : &quot;//DataService [@type ='PR_IB']/ID&quot;,
        'CHE' : &quot;//EquipmentService [@type ='PR_CPE']/ID&quot;
        }"/>

    <xsl:template match="root">
        <xsl:copy>
            <ID>
                <xsl:evaluate xpath="$map(ID/@schemeID)" context-item="/"/>
            </ID>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

, который при работе с исправленным вводом

<root>
    <ID schemeID="CHE"></ID>
    <Services>
        <DataService type='PR_ACC'>
            <ID>12345</ID>
        </DataService>
        <DataService type='PR_BCC'>
            <ID>12345</ID>  
        </DataService>
        <EquipmentService type='PR_CPE'>
            <ID>98765</ID>      
        </EquipmentService>
    </Services>
</root>

выходы <root><ID><ID>98765</ID></ID></root>.

...