1

我需要转换我的 xml 文件并根据我的 xml 文件的内容向其中添加一个新节点。例如我有:

<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>

如果我在不同行中具有相同 num 属性值的单元格中具有相同的值,但在另一对单元格中具有不同的值(在我的示例中,它是具有 @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 的单元格分组,那么我可以想到的一种方法是按一个键对这些单元格进行分组

<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 回答