我有这样的数据 -
<item>
<name>Bob</name>
<fav_food>pizza</fav_food>
<key>Salary</key>
<value />
<value2>1000</value2>
<value3 />
</item>
我希望我的输出看起来像这样 -
<item>
<name>Bob</name>
<fav_food>pizza</fav_food>
<Salary>1000</Salary>
</item>
在这种情况下,Salary的值为1000,因为value为空而value2不为(value的优先级高于value2,优先级高于value3)。
保证value,value2和value3都存在,并且只有其中一个是非空的。是否可以使用XSLT转换来执行此操作?
目前,这是我的转型。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="key">
<xsl:element name="{substring-before(substring-after(.,'{'),'}')}">
<xsl:choose>
<xsl:when test="value != ''">
<xsl:value-of select="following-sibling::value" />
</xsl:when>
<xsl:when test="value2 != ''">
<xsl:value-of select="following-sibling::value2" />
</xsl:when>
<xsl:when test="value3 != ''">
<xsl:value-of select="following-sibling::value3" />
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:3)
我认为你可以做到
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="key">
<xsl:element name="{.}">
<xsl:copy-of select="../(value, value2, value3)/text()"/>
</xsl:element>
</xsl:template>
<xsl:template match="item/value | item/value2 | item/value3"/>
</xsl:stylesheet>
您可能需要或需要调整元素名称生成但我没有应用您的name="{substring-before(substring-after(.,'{'),'}')}"
,因为我在输入样本中没有看到任何大括号。