使用XSLT将特定XML节点值替换为ABC

时间:2017-02-08 17:16:44

标签: java xml xslt groovy

示例XML:

<MAIN>
    <A>
        <first_name>Franklin</first_name>
        <first_name_Previous></first_name_Previous>
        <formal_name>Franklin Alagala </formal_name>
        <gender>M</gender>
        <is_overridden>false</is_overridden>
    </A>
    <B>
        <first_name>Franklin</first_name>
        <formal_name>Franklin Alagala </formal_name>
        <gender>M</gender>
        <gender_Previous></gender_Previous>
        <is_overridden>false</is_overridden>
    </B>
</MAIN>

预期产出:

<MAIN>
    <A>
        <first_name>Franklin</first_name>
        <first_name_Previous>ABCD</first_name_Previous>
        <formal_name>Franklin Alagala </formal_name>
        <gender>M</gender>
        <is_overridden>false</is_overridden>
    </A>
    <B>
        <first_name>Franklin</first_name>
        <formal_name>Franklin Alagala </formal_name>
        <gender>M</gender>
        <gender_Previous>ABCD</gender_Previous>
        <is_overridden>false</is_overridden>
    </B>
</MAIN>

想要替换包含名称的节点,并且该节点为空。但是,如果节点包含名称为previous且value存在,则应保留名称。

3 个答案:

答案 0 :(得分:0)

让我以其他方式介绍你的描述,这会更好地引导 达到预期的解决方案。

  1. 您查看filter(p_rle, values == 0, lengths <= 2) #> # A tibble: 3 x 3 #> lengths values str #> <int> <dbl> <chr> #> 1 1 0 0 #> 2 1 0 0 #> 3 1 0 0 的每个子元素(MAINA,可能BC等等,让我们来电话它水桶

  2. 您要按以下方式处理的每个存储桶:

    • 查看每个子元素。
    • 如果此元素没有空文本内容,请保持不变。
    • 否则(此元素没有文本)读取元素的内容 同名,但在上一个存储桶中。
    • 如果刚刚读取的值不为空,请将当前元素的文本设置为该值。
    • 否则,将当前元素的内容设置为 ABCD
  3. 然后我们可以在XSL中编写上述规则如下:

    D

答案 1 :(得分:0)

  

我不知道如何在名称中找到前一个节点。

尝试:

*[contains(name(), 'Previous')]

如果您想进一步将其限制为空元素,可以使用:

*[contains(name(), 'Previous') and not(node())]

请注意,XML区分大小写; “previous”与“Previous”不同。

答案 2 :(得分:0)

我写的代码工作正常:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date">
    <xsl:output indent="yes" />
    <xsl:template match="@*|node()">
        <xsl:copy>
        <xsl:if test="contains(name(), '_previous')">
         <xsl:if test="not(string(.))">PREVIOUS</xsl:if>      
        </xsl:if>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
相关问题