首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查预定义列表是否缺少XSLT2.0元素

检查预定义列表是否缺少XSLT2.0元素
EN

Stack Overflow用户
提问于 2014-11-28 11:38:17
回答 1查看 836关注 0票数 2

我有一个XML文件:

代码语言:javascript
运行
复制
<Items>
    <Item Name="1" Value="test1"></Item>
    <Item Name="2" Value="test2"></Item>
</Items>

我想用预定义的列表进行转换:

代码语言:javascript
运行
复制
<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。如果该项在此列表中定义,并且在输入XML文件中不可用(如本例中的Item Name="3"),则应将该值设置为空:

代码语言:javascript
运行
复制
<Items>
    <Item Name="1" Value="TEST1"></Item>
    <Item Name="2" Value="TEST2"></Item>
    <Item Name="3" Value="EMPTY"></Item>
</Items>

到目前为止我所拥有的是:

代码语言:javascript
运行
复制
<?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子句中检测某个项是否丢失的想法。有人能告诉我怎么解决这个问题吗?也许有个功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-28 12:08:56

像这样的东西对你有用吗?

XSLT2.0

代码语言:javascript
运行
复制
<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>

应用于输入示例,结果是:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Item Name="1" Value="TEST1"/>
   <Item Name="2" Value="TEST2"/>
   <Item Name="3" Value="EMPTY"/>
</root>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27187832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档