没有段名称的XSLT副本

时间:2018-08-17 12:15:25

标签: xslt

我有以下XML:

<segment>
    <personal_information>
        <birth_name>xxx</birth_name>
        <created_by>yyy</created_by>
        <created_on_timestamp>2018-08-06T06:41:07.000Z</created_on_timestamp>
    </personal_information>
<segment>

我想在添加新字段的同时复制包含所有元素和子段的整个personal_information段。我尝试过:

<segment>
    <personal_information>
        <action>DELETE</action>
        <xsl:copy>
            <xsl:apply-templates select="child::node()"/>
        </xsl:copy>
    </personal_information>
</segment>

但这会导致以下结果:

<segment>
    <personal_information>
        <action>DELETE</action>
        <personal_information>
            <birth_name>xxx</birth_name>
            <created_by>yyy</created_by>
            <created_on_timestamp>2018-08-06T06:41:07.000Z</created_on_timestamp>
        </personal_information>
    </personal_information>
</segment>

将是实现此目标的XSLT代码:

<segment>
    <personal_information>
        <action>DELETE</action>
        <birth_name>xxx</birth_name>
        <created_by>yyy</created_by>
        <created_on_timestamp>2018-08-06T06:41:07.000Z</created_on_timestamp>
    </personal_information>
</segment>

我不想一一复制所有字段。

3 个答案:

答案 0 :(得分:0)

您需要一个身份模板和一个Personal_information并添加一个action元素:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

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

    <xsl:template match="personal_information">
        <xsl:copy>
            <action>DELETE</action>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

使用 <xsl:copy> ,而不是使用<xsl:copy-of>,它接受​​要包含在副本中的节点的XPath表达式;在这种情况下,只有内部子节点。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="segment">
        <segment>
            <personal_information>
                <action>DELETE</action>
                <xsl:copy-of select="personal_information/*" />         
            </personal_information>
        </segment>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

根据新要求进行了更新:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

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

    <xsl:template match="personal_information">
            <action>DELETE</action>
            <xsl:apply-templates select="node()"/>
    </xsl:template>

</xsl:stylesheet>