XSLT 2.0检查预定义列表中是否缺少Element

时间:2014-11-28 11:38:18

标签: xml xslt

我有一个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子句中是否缺少某个项目。任何人都可以给我一个提示如何解决这个问题?也许有功能?

1 个答案:

答案 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>