0

そのグループ内のすべての tr(item) が td(index=1) 要素の値にそのサフィックスを持っている場合、移動(アイテムから削除してグループに追加)サフィックスをしたいと思います。つまり、'[s2]' をグループ A に、[s1] をグループ B に移動する必要があります。

この XML は次のようになります。

<table xmlns="MyNamespaceUri"> 
  <tr type="group"> <td index="1">Group A</td> </tr> 
  <tr type="item"> 
    <td index="1"> Item Type A1 [s1],[s2],[s3]</td> 
    <td index="2">11</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type A2 [s1],[s2]</td> 
    <td index="2">21</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type A3 [s2],[s4]</td> 
    <td index="2">31</td> 
  </tr> 
  <tr type="total"> <td index="2">63</td> </tr> 

  <tr type="group"> 
    <td index="1">Group B</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type B1 [s1],[s2],[s3]</td> 
    <td index="2">12</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type B2 [s1],[s3]</td> 
    <td index="2">22</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type B3 [s1],[s4]</td> 
    <td index="2">32</td> 
  </tr> 
  <tr type="total"> <td index="2">66</td> </tr> 
</table>

次のように変換されます。

<table xmlns="MyNamespaceUri"> 
  <tr type="group"> <td index="1">Group A [s2]</td> </tr> 
  <tr type="item"> 
    <td index="1"> Item Type A1 [s1],[s3]</td> 
    <td index="2">11</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type A2 [s1]</td> 
    <td index="2">21</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type A3 [s4]</td> 
    <td index="2">31</td> 
  </tr> 
  <tr type="total"> <td index="2">63</td> </tr> 

  <tr type="group"> 
    <td index="1">Group B [s1]</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type B1 [s2],[s3]</td> 
    <td index="2">12</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type B2 [s3]</td> 
    <td index="2">22</td> 
  </tr> 
  <tr type="item"> 
    <td index="1"> Item Type B3 [s4]</td> 
    <td index="2">32</td> 
  </tr> 
  <tr type="total"> <td index="2">66</td> </tr> 
</table>

事前に感謝します。

編集:

XSL/T の初心者である私は、これに数日間取り組んだ後に得たものを以下に示します。「置換」機能を動作させることができませんでした。関数が見つからないか有効な例外をスローしていました(バージョン2.0に変更しましたが)。次に、翻訳を試みました (これはこの問題には適していません)。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="MyNamespaceUri" version="2.0">
<xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @* "/>
    </xsl:copy>
  </xsl:template>

  <xsl:variable name="arg1" select="'[s2]'"></xsl:variable>

  <xsl:template match="a:table/a:tr[@type='group']/a:td">
    <xsl:copy-of select="."/>
    <xsl:variable name="arg2" select="../../a:tr[@type='item']/a:td[@index='1']"></xsl:variable>
    <td>
      <xsl:if test="contains($arg2,$arg1)='true'">
        <xsl:value-of select="$arg1" />
      </xsl:if>
    </td>
  </xsl:template>

  <xsl:template match="a:tr[@type='item']/a:td[@index='1']">
    <td index="1">
      <xsl:value-of select="translate(., $arg1, '')" />
    </td>
  </xsl:template>

  <xsl:template match="a:table/a:tr[@type='group']/a:td"/>
4

1 に答える 1

0

最大の課題は、入力 xml 構造です。これは、私が対処する唯一の課題です (つまり、残りはあなた次第です)。実際には 10 行のテーブルがありますが、グループ A に属する行とグループbに属する行を分離できるように、これらの行のサブセットをグループ化する必要があります。それができる s を考え出すのは難しいXPathですが、不可能ではありません。

たとえば、このテンプレートはtrグループのアイテムを変数に分離してから、変数をコピーします。

<xsl:template match="a:table/a:tr[@type='group']">
    <xsl:variable name="trs" select="following-sibling::a:tr[ . &lt;&lt; current()/following-sibling::a:tr[@type='total'][1]]" />

    <xsl:copy-of select="$trs" />
</xsl:template>

キーは XPath です。following-sibling::a:tr[ . &lt;&lt; current()/following-sibling::a:tr[@type='total'][1]]これは、「次のすべての兄弟ノードを選択することを意味しtrますtrtype='total'

item行を独自の変数に分離できるようになったのでtd/text()、一致するかどうか変数の値の内容をテストし、String必要に応じて条件付きロジックを追加するコードを記述できます。

コードには名前空間の問題もあります。コピーするときは、途中で入力の名前空間を失わないように注意してくださいcopy-namespaces="yes"

<xsl:template match="node() | @*">
    <xsl:copy copy-namespaces="yes">
        <xsl:apply-templates select="node() | @* "/>
    </xsl:copy>
</xsl:template>
于 2013-10-03T22:33:22.403 に答える