我有一个xml输入,如下所示
<items>
<item id="1" name="aaa" old_level="1" new_level="1"/>
<item id="2" name="bbb" old_level="2" new_level="3"/>
<item id="3" name="ccc" old_level="3" new_level="3"/>
</items>
我想复制整个文档并添加old_level与new_level不同的项目名称。注意:只有一个项目可以不同。
我的xslt代码如下所示
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/items">
<xsl:for-each select="/items/item">
<xsl:variable name="new-level">
<xsl:value-of select="@new_level"/>
</xsl:variable>
<xsl:variable name="old-level">
<xsl:value-of select="@old_level"/>
</xsl:variable>
<xsl:if test="string($new-level) != string($old-level)">
<xsl:variable name="threshold">
<xsl:value-of select="@name"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="selected_item">
<xsl:value-of select="@name"/>
</xsl:attribute>
</xsl:copy>
</xsl:if>
</xsl:for-each>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<item selected_item="bbb"/>
<items>
<item id="1" name="aaa" new_level="1" old_level="1"/>
<item id="2" name="bbb" new_level="3" old_level="2"/>
<item id="3" name="ccc" new_level="3" old_level="3"/>
</items>
我想看到的是:
<?xml version="1.0" encoding="UTF-8"?>
<items selected_item="bbb">
<item id="1" name="aaa" new_level="1" old_level="1"/>
<item id="2" name="bbb" new_level="3" old_level="2"/>
<item id="3" name="ccc" new_level="3" old_level="3"/>
</items>
我该怎么做?
答案 0 :(得分:1)
如果肯定会有一个这样的元素,那么它就像
一样简单<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/items">
<items selected_item="{item[@new_level != @old_level]/@name}">
<xsl:apply-templates select="@*|node()"/>
</items>
</xsl:template>
</xsl:stylesheet>
如果有可能存在 no 选择的项目(即没有新旧级别不同的项目),那么在这种情况下你需要一些条件逻辑来省略属性:
<xsl:template match="/items">
<items>
<xsl:variable name="selectedItem"
select="item[@new_level != @old_level]/@name" />
<xsl:if test="$selectedItem">
<xsl:attribute name="selected_item">
<xsl:value-of select="$selectedItem" />
</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="@*|node()"/>
</items>
</xsl:template>