我有一个XML文件:
<Items>
<Item Name="1" Value="test1"></Item>
<Item Name="2" Value="test2"></Item>
</Items>
我想用预定义列表进行转换:
<Items>
<Item Name="1">
<Value OldValue="test1" NewValue="TEST1" ></Value>
</Item>
<Item Name="2">
<Value OldValue="test2" NewValue="TEST2" ></Value>
</Item>
<Item Name="3">
<Value OldValue="" NewValue="TEST3" ></Value>
</Item>
</Items>
因此,应该将值从OldValue更改为NewValue。如果在此列表中定义了Item,并且在此示例中输入XML文件(如Item Name =“3”)中不可用,则Value应设置为EMPTY:
<Items>
<Item Name="1" Value="TEST1"></Item>
<Item Name="2" Value="TEST2"></Item>
<Item Name="3" Value="EMPTY"></Item>
</Items>
到目前为止我所拥有的:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.cdisc.org/ns/odm/v1.3"
xmlns="http://www.cdisc.org/ns/odm/v1.3">
<xsl:strip-space elements="*" />
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" name="xml" />
<xsl:variable name="Items">
<Item Name="1">
<Value OldValue="test1" NewValue="TEST1" ></Value>
</Item>
<Item Name="2">
<Value OldValue="test2" NewValue="TEST2" ></Value>
</Item>
<Item Name="3">
<Value OldValue="test3" NewValue="TEST3" ></Value>
</Item>
</xsl:variable>
<xsl:template match="Items">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="Item">
<xsl:copy>
<xsl:attribute name="Value">
<xsl:choose>
<xsl:when >
<!-- check if Item is defined in Items and missing here -->
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$Items/Item[@Name=current()/@Name]/Value[@OldValue = current()/@Value]/@NewValue"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:copy-of select="@*[name()!= 'Value']" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我缺少的是如何检测when子句中是否缺少某个项目。任何人都可以给我一个提示如何解决这个问题?也许有功能?
答案 0 :(得分:0)
这样的事情对你有用吗?
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="item" match="Item" use="@Name" />
<xsl:variable name="xml" select="/" />
<xsl:variable name="Items">
<Item Name="1">
<Value OldValue="test1" NewValue="TEST1" ></Value>
</Item>
<Item Name="2">
<Value OldValue="test2" NewValue="TEST2" ></Value>
</Item>
<Item Name="3">
<Value OldValue="test3" NewValue="TEST3" ></Value>
</Item>
</xsl:variable>
<xsl:template match="/">
<root>
<xsl:for-each select="$Items/Item">
<Item Name="{@Name}" Value="{Value/@NewValue}">
<xsl:if test="not(key('item', @Name, $xml))">
<xsl:attribute name="Value">EMPTY</xsl:attribute>
</xsl:if>
</Item>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例,结果为:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Item Name="1" Value="TEST1"/>
<Item Name="2" Value="TEST2"/>
<Item Name="3" Value="EMPTY"/>
</root>