示例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存在,则应保留名称。
答案 0 :(得分:0)
让我以其他方式介绍你的描述,这会更好地引导 达到预期的解决方案。
您查看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
的每个子元素(MAIN
,A
,可能B
,C
等等,让我们来电话它水桶。
您要按以下方式处理的每个存储桶:
然后我们可以在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>