Как заставить XSLT работать с XML с повторяющимися записями

0 F_Pfeifer [2017-01-13 16:56:00]

У меня есть следующая проблема: в xsd указано:

<xs:element name="somevalue" type="ait2:eic" maxOccurs="unbounded">
    <xs:annotation>
        <xs:documentation>Field No. 41</xs:documentation>
    </xs:annotation>
</xs:element>

Который для меня означает, что поле 41 может присутствовать более одного раза (поле 39 или 42 разрешено только один раз). У меня есть пример, где он на самом деле (из xml):

<somevalue>12323K</somevalue>
<somevalue>12324I</somevalue>

Так как его не в своей последовательности для каждого невозможно (или я ошибаюсь?). Мой код выглядит так до сих пор (xslt), который просто охватывает первое появление:

<tr>
    <td>41</td>
    <td>Some value</td>
    <td>
        <xsl:value-of select="//somevalue"/>
    </td>
</tr>

Как можно иметь повторяющуюся группу? Таким образом, каждая запись "somevalue" будет присутствовать.

СПАСИБО!

EDIT: пример кода

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="#nsc"?>
<xsl:stylesheet id="nsc" version="1.0" xmlns:data="http://www.acer.europa.eu/REMIT/TestTable_V1.xsd" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<data:data>
    <TestTable>
        <TradeList>
            <nonStandardContractReport>
                <settlementMethod>P</settlementMethod>
                <deliveryPointOrZone>12323K</deliveryPointOrZone>
                <deliveryPointOrZone>12324I</deliveryPointOrZone>
                <deliveryStartDate>2022-01-01</deliveryStartDate>
                <deliveryEndDate>2023-01-01</deliveryEndDate>
                <loadType>GD</loadType>
                <actionType>N</actionType>
            </nonStandardContractReport>
        </TradeList>
    </TestTable>
</data:data>
<xsl:template match="/xsl:stylesheet">
    <xsl:apply-templates select="data:data/*" />
</xsl:template>
<xsl:template match="TestTable">
    <html>
        <table border="0" style="border-collapse:collapse;">
            <body>
                <tr>
                    <td>40</td>
                    <td>Option strike price</td>
                    <td>
                        <xsl:value-of select="//optionDetails/optionStrikePrice"/>
                    </td>
                </tr>
                <tr>
                    <th/>
                    <th>Delivery profile</th>
                    <th/>
                </tr>
                <tr>
                    <td>41</td>
                    <td>Delivery point or zone</td>
                    <td>
                        <xsl:value-of select="//deliveryPointOrZone"/>
                    </td>
                </tr>
                <tr>
                    <td>42</td>
                    <td>Delivery start date</td>
                    <td>
                        <xsl:value-of select="//deliveryStartDate"/>
                    </td>
                </tr>
                <tr>
                    <td>43</td>
                    <td>Delivery end date</td>
                    <td>
                        <xsl:value-of select="//deliveryEndDate"/>
                    </td>
                </tr>
                <tr>
                    <td>44</td>
                    <td>Load type</td>
                    <td>
                        <xsl:value-of select="//loadType"/>
                    </td>
                </tr>
                <tr>
                    <th/>
                    <th>Life cycle information</th>
                    <th/>
                </tr>
                <tr>
                    <td>45</td>
                    <td>Action type</td>
                    <td>
                        <xsl:value-of select="//actionType"/>
                    </td>
                </tr>
            </body>
        </table>
    </html>
</xsl:template>

html xml xslt


1 ответ


0 Решение michael.hor257k [2017-01-13 18:09:00]

Рассмотрим следующий пример:

XML

<root>
    <alpha>10</alpha>
    <bravo>20</bravo>
    <bravo>21</bravo>
    <bravo>22</bravo>
    <charlie>30</charlie>
</root>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />

<xsl:template match="/root">
    <table border="1">
        <tr>
            <td>A</td>
            <td>Prima</td>
            <td>
                <xsl:value-of select="alpha"/>
            </td>
        </tr>
        <xsl:for-each select="bravo">
            <tr>
                <td>B</td>
                <td>Secunda</td>
                <td>
                    <xsl:value-of select="."/>
                </td>
            </tr>
        </xsl:for-each>
        <tr>
            <td>C</td>
            <td>Tertia</td>
            <td>
                <xsl:value-of select="charlie"/>
            </td>
        </tr>
    </table>
</xsl:template>

</xsl:stylesheet>

результат

<table border="1">
   <tr>
      <td>A</td>
      <td>Prima</td>
      <td>10</td>
   </tr>
   <tr>
      <td>B</td>
      <td>Secunda</td>
      <td>20</td>
   </tr>
   <tr>
      <td>B</td>
      <td>Secunda</td>
      <td>21</td>
   </tr>
   <tr>
      <td>B</td>
      <td>Secunda</td>
      <td>22</td>
   </tr>
   <tr>
      <td>C</td>
      <td>Tertia</td>
      <td>30</td>
   </tr>
</table>

отображается как:

enter image description here


Обратите внимание, что тот же результат мог быть достигнут с использованием более элегантного подхода:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />

<xsl:template match="/root">
    <table border="1">
        <xsl:apply-templates/>
    </table>
</xsl:template>

<xsl:template match="alpha">
    <tr>
        <td>A</td>
        <td>Prima</td>
        <td>
            <xsl:value-of select="."/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="bravo">
    <tr>
        <td>B</td>
        <td>Secunda</td>
        <td>
            <xsl:value-of select="."/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="charlie">
    <tr>
        <td>C</td>
        <td>Tertia</td>
        <td>
            <xsl:value-of select="."/>
        </td>
    </tr>
</xsl:template>

</xsl:stylesheet>