更改重复的元素名称xslt xml

时间:2017-08-14 01:42:58

标签: xml xslt

我一直在尝试重构XML文件,并且到目前为止能够完成大部分更改。我需要做的是更改现在已经重复的元素的名称。

输入

<products>
<product>
<name>name</name>
<description>this description</description>
<code>111</code>
<thumbnail> </thumbnail>
<image1></image1>
<image2></image2>
<image3></image3>
<prodoptions>
<prodoption code="123" description="that description"/>
<prodoption code="456" description="other description"/>
</prodoptions>
</product>
</products>

XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/products">
<xsl:copy>
    <xsl:for-each select="product/prodoptions/prodoption">
        <product>
            <xsl:copy-of select="../../name"/>
            <xsl:copy-of select="../../code"/>
            <xsl:copy-of select="../../description"/>
            <xsl:copy-of select="../../thumbnail"/>
            <xsl:copy-of select="../../image1"/>
            <xsl:copy-of select="../../image2"/>
            <xsl:copy-of select="../../image3"/>
            <xsl:for-each select="@*">
                <xsl:element name="{name()}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:for-each>
        </product>
    </xsl:for-each>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

输出

<products>
    <product>
        <name>name</name>
        <code>111</code>
        <description>this description</description>
        <thumbnail></thumbnail>
        <image1></image1>
        <image2></image2>
        <image3></image3>
        <code>123</code>
        <description>that description</description>
    </product>
    <product>
        <name>name</name>
        <code>111</code>
        <description>this description</description>
        <thumbnail></thumbnail>
        <image1></image1>
        <image2></image2>
        <image3></image3>
        <code>456</code>
        <description>other description</description>
    </product>
</products>

需要重命名第二个代码和描述(我从prodoption的属性中提取的那些代码和描述)。我之前已经将该属性重命名为元素,但是我发现当我这样做时,属性会在应用重命名之前更改为元素。

1 个答案:

答案 0 :(得分:1)

嗯,你可以简单地改变一下:

<xsl:element name="name()}">

说:

<xsl:element name="option-{name()}">

得到:

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <name>name</name>
    <code>111</code>
    <description>this description</description>
    <thumbnail/>
    <image1/>
    <image2/>
    <image3/>
    <option-code>123</option-code>
    <option-description>that description</option-description>
  </product>
  <product>
    <name>name</name>
    <code>111</code>
    <description>this description</description>
    <thumbnail/>
    <image1/>
    <image2/>
    <image3/>
    <option-code>456</option-code>
    <option-description>other description</option-description>
  </product>
</products>

根据您想要达到的确切结果,还有许多其他可能的解决方案。