XSLT将父属性复制到较低级别

时间:2018-03-12 14:47:27

标签: xml xslt

我是XSLT的新手,所以这可能是基本的,但我真的很感激一些输入。我需要将父标记值复制到较低的节点,并替换子标记的值。

所以我的初始XML是

<?xml version="1.0"?>
<Header>
    <expand>names,schema</expand>
    <total>579</total>
    <maxResults>1</maxResults>
    <issues>
        <expand>test1</expand>
        <self>test2</self>
        <id>19988</id>
        <fields>
            <summary>Getting error when trying to complete Return Item Processing in FBCDAT</summary>
            <issuetype>
                <name>Functionality</name>
                <self>abc</self>
                <description>An issue within the functionality</description>
                <id>9</id>
            </issuetype>
        </fields>
    </issues>
</Header>

我的要求是,

  1. <id>19988</id>复制到字段级别。
  2. <id>9</id>下的<issuetype>替换为<id>19988</id>
  3. 所以预期的XML是

    <?xml version="1.0"?>
    <Header>
        <expand>names,schema</expand>
        <total>579</total>
        <maxResults>1</maxResults>
        <issues>
            <expand>test1</expand>
            <self>test2</self>
            <id>19988</id>
            <fields>
                <id>19988</id>
                <summary>Getting error when trying to complete Return Item Processing in FBCDAT</summary>
                <issuetype>
                    <name>Functionality</name>
                    <self>abc</self>
                    <description>An issue within the functionality</description>
                    <id>19988</id>
                </issuetype>
            </fields>
        </issues>
    </Header>
    

    任何帮助将不胜感激。

    先谢谢。

1 个答案:

答案 0 :(得分:0)

从身份模板开始

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

要将id字段复制到fields元素,您需要一个匹配fields的模板来完成工作...

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

要替换id下的issuetype,还有另一个模板......

<xsl:template match="issuetype/id">
    <xsl:copy-of select="../../../id" />
</xsl:template>

完全放下这个....

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

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

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

    <xsl:template match="issuetype/id">
        <xsl:copy-of select="../../../id" />
    </xsl:template>
</xsl:stylesheet>