0

1.0を使用してXSLT内に順不同のタグを含めることは可能ですか?私の最初の推測はそうではありません。XMLのルールに違反しているからです。

X要素を持つXMLデータを考えてみましょう。これらのXエントリを個々のブロック内の3つのブロックに分割したいと思い<div>ます。私がやりたいはこれですが、明らかにそれは完全に無効なコードです...

<div>
  <xsl:for-each select="mydata">
    <xsl:value-of select="myvalue"/><br/>
    <xsl:if test="(position() mod 3)=0">
      </div> <!-- This is invalid -->
      <div> <!-- This is invalid -->
    </xsl:if>
  </xsl:for-each>
</div>

したがって、8つの要素の場合、結果の例は次のようになります。

<div>
  value1<br/>
  value2<br/>
  value3<br/>
</div>
<div>
  value4<br/>
  value5<br/>
  value6<br/>
</div>
<div>
  value7<br/>
  value8<br/>
</div>

上記が単純に不可能な場合(私はそれが不可能だと思うので)、誰かがこのようにそれらをグループ化するための許容可能な方法を提案できますか?

(これはXSLT 1.0ソリューションでなければならないことに注意してください)

4

2 に答える 2

2

あなたがやろうとしていること可能ですが、それは良い考えではありません。これはより良いアプローチです:

<xsl:apply-templates select="mydata[position() mod 3 = 1]" mode="group" />

<!-- Separate templates -->
<xsl:template match="mydata" mode="group">
  <div>
    <xsl:apply-templates select=". | following-sibling::mydata[position() &lt; 3]" />
  </div>
</xsl:template>

<xsl:template match="mydata">
  <xsl:value-of select="myvalue"/><br/>
</xsl:template>
于 2013-03-14T19:07:34.430 に答える
2

JLRisheはあなたに解決策を示します。

あなたの問題は、あなたがあなたのスタイルシートを開始タグと終了タグを書くこととして考えているということです。これはXSLTが行うことではありません。ツリーを書き込みます。結果ツリーにノードの半分を書き込むことはできません。タグではなくノードを考えてください。

このような問題が発生し、出力構造が入力構造と完全に一致しない場合、もう1つの経験則として、スタイルシートの構造は入力のツリー構造ではなく、出力のツリー構造を反映する必要があります。「次のABC入力ノードをどうすればよいか」ではなく、「結果ツリーにXYZノードを生成する必要があります。その内容をどのように計算すればよいですか?」

于 2013-03-15T08:59:00.127 に答える