我有这样的XML:
<Parent>
<Elem1 Attr1="1" Attr2="2">
<Elem2>
<Elem3 Attr1="4" Attr2="5"></Elem3>
</Elem2>
</Elem1>
</Parent>
应该变成这个:
<Parent>
<Elem1 Attr1="1+2">
<Elem2>
<Elem3 Attr1="4+5"></Elem3>
</Elem2>
</Elem1>
</Parent>
问题在于我不知道元素的名称,即Elem1
或Elem3
。我知道元素必须包含属性Attr1
和属性Attr2
,但不能提前包含所有这些元素名称。
我也知道父元素必须具有名称Parent
,但包含属性的子元素可以处于任何级别,可以是直接后代,也可以是父树中更深层次的。
我能找到的最接近可能的解决方案就是这个 StackOverflow post但我的XSLT知识还不足以让它适应这种情况。
答案 0 :(得分:1)
我想你想做点什么:
XSLT 1.0
<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:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Attr1[../@Attr2]">
<xsl:attribute name="Attr1">
<xsl:value-of select="."/>
<xsl:text>+</xsl:text>
<xsl:value-of select="../@Attr2"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@Attr2[../@Attr1]"/>
</xsl:stylesheet>
答案 1 :(得分:1)
解决这个问题的一种方法是
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Parent//*[@Attr1 and @Attr2]/@Attr1">
<xsl:attribute name="Attr1" select="concat(., '+', ../@Attr2)"/>
</xsl:template>
<xsl:template match="Parent//*[@Attr1 and @Attr2]/@Attr2"/>
</xsl:transform>