[英]Rename and add new elements using XSLT 1.0
I have a following issue when trying to modify my XML file. 尝试修改XML文件时出现以下问题。 I'm trying to apply three transformations to the input below: 我正在尝试将三种转换应用于以下输入:
<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) shift/rename columns by 4, I was able to do that using following XSLT: 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>
output received: 收到的输出:
<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) add elements before already existing ones so below output is received: I have to say I'm lost here as have no ideas how to make it work. 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) incorporate following XSLT I was using to propagate data, it works if its applied on its own but when merged with point 1) i got no result only pint 1 is being applied 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>
My expected result would be: 我的预期结果将是:
<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>
Thanks, Lehu 谢谢乐湖
It's not pretty, but here you go. 它不漂亮,但是您去了。
<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.