Я только что познакомился с xslt и xml за последние несколько недель, и мне срочно нужна помощь в написании кода для достижения того, чего я хочу достичь. У меня есть следующий XML:XSLT foreach loop
<?xml version="1.0" encoding="UTF-8"?>
<abc1 formName="Form">
<Level1>
<Element1>ZZZ</Element1>
<Element2>
<SubElement1>Apples</SubElement1>
<SubElement2>Oranges</SubElement2>
<SubElement3>Pears</SubElement3>
<SubElement4>Blueberries</SubElement4>
<SubElement5>Milkshakes</SubElement5>
</Element2>
</Level1>
<Level1>
<Element1>XXX</Element1>
<Element2>
<SubElement1>Apples</SubElement1>
<SubElement2>Oranges</SubElement2>
<SubElement3>Kiwifruit</SubElement3>
<SubElement4>Blueberries</SubElement4>
<SubElement5>Soda</SubElement5>
</Element2>
</Level1>
</abc1>
и следующий HTML таблица:
<table>
<tr>
<td width="180" > Row 1</td>
<td width="540" colspan="4"> Cell_A</td>
</tr>
<tr>
<td width="180" >Types</td>
<td width="180" >Type 1</td>
<td width="180" >Type 2</td>
<td width="180" >Type 3</td>
</tr>
<tr>
<td width="180" >Row 2</td>
<td width="180" >Cell_B</td>
<td width="180" >Cell_C</td>
<td width="180" >Cell_D</td>
</tr>
<tr>
<td width="180" > Row 3</td>
<td width="180" >Cell_E</td>
<td width="180" >Cell_F</td>
<td width="180" >Cell_G</td>
</tr>
<tr>
<td width="180" >Row 4</td>
<td width="180" >Cell_H</td>
<td width="180" >Cell_I</td>
<td width="180" >Cell_J</td>
</tr>
<tr>
<td width="180" > Row 5</td>
<td width="540" colspan="4"> Cell_K</td>
</tr>
</table>
У меня возникли проблемы с использованием XSLT для извлечения данных из XML в таблицу, так как правила, что мне нужно применять делают его очень сложным. Ниже приведены правила, которые должны применяться к ячейкам, с которыми у меня возникают проблемы.
(1) Если значение <Element1>
одно и то же на протяжении всего XML, то:
Если <Element1>
= 'ZZZ', то Cell_B = '10', Cell_C = '20', а Cell_D = '30'
Если <Element1>
= 'XXX', то Cell_B = '100', Cell_C = '90', а Cell_D = '80'
, но если значение <Element1>
отличается в XML, то:
Cell_B = '10, 100 ', Cell_C = '20, 90' и Cell_D = '30, 80 '
(2) Если значение <SubElement5>
одно и то же на протяжении всего XML, то:
Cell_J = значение <SubElement5>
, но если значение <SubElement5>
отличается в XML, то:
Cell_J = значение обоих значений <SubElement5>
, разделенных запятой
поэтому в этом случае значением для Cell_J будет «Milkshakes, Soda».
Я экспериментировал с различными вещами, используя:
<xsl:for-each select="./Level1/Element2">
<xsl:value-of select="./SubElement5"/>
</xsl:for-each>
, но я не могу определить, какой код я могу использовать, чтобы проверить, если они одинаковы, потому что я не могу перезаписать значение переменной.
Edit: Пожалуйста, обратите внимание, что клетки я, указанные выше (клетки B, C, D и J) являются единственными, я нужна помощь с. Кроме того, для Element1
существует четыре возможных значения: : ZZZ, XXX, AAA и BBB. Требуемые значения для каждого из них будет: (клетки B, C, и D)
ZZZ:10,20,30
XXX:100,90,80
AAA:40,30,30
BBB:50,30,20
так что, если существует только один потенциальное значение во всем XML, клетки должны появляться со значениями, как указано выше. Если значения двух элементов 1 различны, ячейки должны перечислять приведенные выше значения в каждой ячейке, разделенные запятой.
Что касается cell_j, я попытаюсь объяснить его немного лучше.
Во-первых, мне нужно определить, совпадает ли значение <SubElement5>
на всем протяжении xml.В этом случае это не так, в одном разделе это Milkshakes, а в другом - «Сода». Поэтому cell_J должен содержать текст «Milkshakes, Soda».
Если XML выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<abc1 formName="Form">
<Level1>
<Element1>ZZZ</Element1>
<Element2>
<SubElement1>Apples</SubElement1>
<SubElement2>Oranges</SubElement2>
<SubElement3>Pears</SubElement3>
<SubElement4>Blueberries</SubElement4>
<SubElement5>Milkshakes</SubElement5>
</Element2>
</Level1>
<Level1>
<Element1>XXX</Element1>
<Element2>
<SubElement1>Apples</SubElement1>
<SubElement2>Oranges</SubElement2>
<SubElement3>Kiwifruit</SubElement3>
<SubElement4>Blueberries</SubElement4>
<SubElement5>Milkshakes</SubElement5>
</Element2>
</Level1>
</abc1>
Тогда значение для cell_j будет просто 'аппетитное'.
Заранее благодарим всех, кто может помочь.
ответ на этот вопрос:
Суммировать, что Вуди сделал ниже для дальнейшего использования чьего:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/abc1">
<xsl:variable name="elements" select="//Element1[not(preceding::Element1 = .)]"/>
<table>
<tr>
<td width="180" > Row 1</td>
<td width="540" colspan="4"> Cell_A</td>
</tr>
<tr>
<td width="180" >Types</td>
<td width="180" >Type 1</td>
<td width="180" >Type 2</td>
<td width="180" >Type 3</td>
</tr>
<tr>
<td width="180" >Row 2</td>
<td width="180" > <xsl:for-each select="$elements">
<xsl:if test="position() != 1">,</xsl:if>
<xsl:choose>
<xsl:when test=". = 'AAA'">40</xsl:when>
<xsl:when test=". = 'BBB'">50</xsl:when>
<xsl:when test=". = 'XXX'">100</xsl:when>
<xsl:when test=". = 'ZZZ'">10</xsl:when>
</xsl:choose>
</xsl:for-each></td>
<td width="180" ><xsl:for-each select="$elements">
<xsl:if test="position() != 1">,</xsl:if>
<xsl:choose>
<xsl:when test=". = 'AAA'">30</xsl:when>
<xsl:when test=". = 'BBB'">30</xsl:when>
<xsl:when test=". = 'XXX'">90</xsl:when>
<xsl:when test=". = 'ZZZ'">20</xsl:when>
</xsl:choose>
</xsl:for-each></td>
<td width="180" ><xsl:for-each select="$elements">
<xsl:if test="position() != 1">,</xsl:if>
<xsl:choose>
<xsl:when test=". = 'AAA'">30</xsl:when>
<xsl:when test=". = 'BBB'">20</xsl:when>
<xsl:when test=". = 'XXX'">80</xsl:when>
<xsl:when test=". = 'ZZZ'">30</xsl:when>
</xsl:choose>
</xsl:for-each></td>
</tr>
<tr>
<td width="180" > Row 3</td>
<td width="180" >Cell_E</td>
<td width="180" >Cell_F</td>
<td width="180" >Cell_G</td>
</tr>
<tr>
<td width="180" >Row 4</td>
<td width="180" >Cell_H</td>
<td width="180" >Cell_I</td>
<td width="180" ><xsl:for-each select="//SubElement5[not(preceding::SubElement5/text() = text())]">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:for-each></td>
</tr>
<tr>
<td width="180" > Row 5</td>
<td width="540" colspan="4"> Cell_K</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
Вуди, благодарственные вас снова. Это было потрясающе.
Вы забыли указать, что входит в ячейки E, F, G, H и I. Пожалуйста, * отредактируйте * вопрос и укажите недостающую информацию. –