1

新しいセルが見つかるまで空でないセルを伝播する 1.0 XSLT 変換を探しています。私の入力:

<table>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value1</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
</table>

期待される出力:

<table>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value1</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value1</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value1</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
</table>

previous::row[1]/column_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 name="replace-value">
    <xsl:param name="value"/>
    <xsl:copy>
        <xsl:value-of select="$value"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="//column_1">
    <xsl:choose>
        <xsl:when test=".=''">
            <xsl:call-template name="replace-value">
                <xsl:with-param name="value" select="preceding::row[1]/column_1/text()"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy>
                <xsl:apply-templates select="node() | @*"/>
            </xsl:copy>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

お気に入り:

<table>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value1</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value1</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1>Value2</column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>
<row>
    <column_1></column_1>
    <column_2></column_2>
</row>

4

2 に答える 2

0

あなたはほとんどそれを持っていましたが、これの代わりに:

preceding::row[1]/column_1/text()

あなたはこれが必要でした:

preceding::row[column_1 != ''][1]/column_1/text()

これはさらに次のように単純化できます。

preceding::column_1[. != ''][1]

空白でない列を持つ最後の行を見つける必要があるためです。

一方、その置換値テンプレートを使用する理由がわかりません。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="column_1">
    <xsl:copy>
      <xsl:choose>
        <xsl:when test=".=''">
          <xsl:value-of select="preceding::column_1[. != ''][1]"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates select="node() | @*"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
于 2013-01-04T16:08:49.233 に答える
0

yotherwise 句内で、下方に伝達したい値を <xsl:variable name="saved" select="."> に保存してから、次の行に保存してみてください。

<xsl:with-param name="value" select="preceding::row[1]/column_1/text()"/>

代わりに

<xsl:with-param name="value" select="$saved"/>

一意の変数名を使用する必要がある列の数によって異なります。

于 2013-01-04T15:33:48.963 に答える