簡體   English   中英

使用XSLT 1.0重命名並添加新元素

[英]Rename and add new elements using XSLT 1.0

嘗試修改XML文件時出現以下問題。 我正在嘗試將三種轉換應用於以下輸入:

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

謝謝樂湖

它不漂亮,但是您去了。

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

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

  <xsl:template match="row">
    <xsl:copy>
      <column_1 />
      <column_2 />
      <column_3 />
      <column_4 />
      <xsl:apply-templates select="*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="row/*">
    <xsl:element name="column_{substring-after(name(), 'column_') + 4}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="column_1[. = '']">
    <column_5>
      <xsl:value-of select="preceding::column_1[. != ''][1]/text()" />
    </column_5>
  </xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM