私はここ数週間でxsltとxmlを紹介されたばかりであり、私が達成したいことを達成するためにいくつかのコードを書くために緊急に助けが必要です。私は次の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>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全体で同じである場合、次のようになります。
='ZZZ'の場合<Element1>
、Cell_B = '10'、Cell_C = '20'、およびCell_D = '30'
='XXX'の場合<Element1>
、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>
しかし、変数の値を上書きできないため、それらが同じであるかどうかを確認するために使用できるコードを判別できません。
編集:
私が上で示したセル(セルb、c、d、およびj)だけが私が助けを必要としていることに注意してください。さらに、Element1
私が遭遇する可能性のある4つの潜在的な値があります: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つしかない場合、セルは上記の値で表示されます。2つの要素1の値が異なる場合、セルは各セルに上記の値をコンマで区切ってリストする必要があります。
cell_jに関しては、もう少し詳しく説明します。
まず、<SubElement5>
xml全体でが同じ値であるかどうかを判断する必要があります。この場合はそうではなく、一方のセクションではミルクセーキであり、もう一方のセクションでは「ソーダ」です。したがって、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の値は「Milkshakes」になります。
助けてくれる人に事前に感謝します。
この質問への回答:
誰かの将来の参考のために、ウッディが以下で行ったことを要約するには:
<?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>
ウッディ、ありがとう。これは最高でした。