Как заставить 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>
отображается как:
Обратите внимание, что тот же результат мог быть достигнут с использованием более элегантного подхода:
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>