1

xml-fileを変換し、xml-fileの内容に応じて新しいノードを追加する必要があります。たとえば、私は持っています:

<sheet name="Sheet1" num="1">
<row num="3">
<cell num="1">FP1152</cell>
<cell num="2">1039_2</cell>
<cell num="3">FP000234</cell>
</row>
<row num="4">
<cell num="1">RT1152</cell>
<cell num="2">1039_1</cell>
<cell num="3">GL000235</cell>
</row>
<row num="6">
<cell num="1">FP1152</cell>
<cell num="2">1039_1</cell>
<cell num="3">FP000234</cell>
</row>

</sheet>

異なる行に同じ値のnumatributeがあるセルに同じ値があるが、別のセルのペア(私の例では@ num=3と@num= 6の行)に異なる値がある場合、このようなフラグ:

<sheet name="Sheet1" num="1">
<flag type="ambiguousSuplier">true<flag>
    <row num="3">
    <cell num="1">FP1152</cell>
    <cell num="2">1039_2</cell>
    <cell num="3">FP000234</cell>
    </row>
    <row num="4">
    <cell num="1">RT1152</cell>
    <cell num="2">1039_1</cell>
    <cell num="3">GL000235</cell>
    </row>
    <row num="6">
    <cell num="1">FP1152</cell>
    <cell num="2">1039_1</cell>
    <cell num="3">FP000234</cell>
    </row>

    </sheet>
4

1 に答える 1

2

特定のシート内の行が@numが 1 と 3 のセルでグループ化されている場合、これを行うために考えられる 1 つの方法は、そのようなセルをキーでグループ化することです

<xsl:key 
 name="cells" 
 match="cell" 
 use="concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num)" />

これは、セルをシート番号で検索し、同じ行内のセル 1 と 2 を検索します。

次に、上記のキーに一致するセルを含むが値が異なるセルがシートに含まれているかどうかを確認する必要があります。これは、次の厄介なステートメントによって行われます

<xsl:template 
  match="sheet
    [row/cell
      [text() != 
      key('cells', 
        concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num))/text()]]">

したがって、次の XSLT を考えると、

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="cells" match="cell" use="concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num)" />

   <xsl:template match="sheet[row/cell[text() != key('cells', concat(../../@num, '|', ../cell[@num='1'], '|', ../cell[@num='3'], '|', @num))/text()]]">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
         <flag type="ambiguousSupplier">true</flag>
         <xsl:apply-templates select="node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

指定された XML に適用すると、次のように出力されます。

<sheet name="Sheet1" num="1">
   <flag type="ambiguousSupplier">true</flag>
   <row num="3">
      <cell num="1">FP1152</cell>
      <cell num="2">1039_2</cell>
      <cell num="3">FP000234</cell>
   </row>
   <row num="4">
      <cell num="1">RT1152</cell>
      <cell num="2">1039_1</cell>
      <cell num="3">GL000235</cell>
   </row>
   <row num="6">
      <cell num="1">FP1152</cell>
      <cell num="2">1039_1</cell>
      <cell num="3">FP000234</cell>
   </row>
</sheet>

もっと簡単な解決策があるに違いないと確信しているので、問題が解決したとしても、この回答はまだ受け入れません.....

于 2012-04-25T12:36:23.363 に答える