0

XML ファイルを変更しようとすると、次の問題が発生します。以下の入力に 3 つの変換を適用しようとしています。

<sheet>
<row>
    <column_1>11</column_1>
    <column_2></column_2>
    <column_3></column_3>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
</row>
</sheet>

1) 列を 4 ずつシフト/名前変更します。次の XSLT を使用してそれを行うことができました。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="row/*">
    <xsl:element name="column_{substring(name(),8,string-length(name())-7)+4}">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:stylesheet>

受け取った出力:

<sheet>
<row>
    <column_5>11</column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
<row>
    <column_5></column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
<row>
    <column_5></column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
</sheet>

2)既存の要素の前に要素を追加して、以下の出力を受け取ります。それを機能させる方法がわからないので、ここで迷っていると言わざるを得ません。

<sheet>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
    <column_4></column_4>
    <column_5>11</column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
    <column_4></column_4>
    <column_5></column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
    <column_4></column_4>
    <column_5></column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
</sheet>

3) データの伝播に使用していた次の XSLT を組み込みます。単独で適用すると機能しますが、ポイント 1 とマージすると結果が得られず、パイント 1 のみが適用されます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
  <xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="column_5">
<xsl:copy>
  <xsl:choose>
    <xsl:when test=".=''">
      <xsl:value-of select="preceding::column_5[. != ''][1]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

私の期待される結果は次のようになります。

<sheet>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
    <column_4></column_4>
    <column_5>11</column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
    <column_4></column_4>
    <column_5>11</column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
    <column_3></column_3>
    <column_4></column_4>
    <column_5>11</column_5>
    <column_6></column_6>
    <column_7></column_7>
</row>
</sheet>

ありがとう、レフ

4

1 に答える 1