根据任何属性的值获取数据

时间:2012-06-14 09:07:28

标签: xslt xslt-1.0

给定一个节点,例如

<SI elem1="TI" elem2="FN" elem3="4099450222" elem4="TM" elem5="4094110000" elem6="MT" elem7="SP" elem8="MC" elem9="DS" elem10="DA" elem11="16"/>

如果任何属性为“DA”,我需要输出为“DA”,如果任何属性为“BA”,则需要下一个属性的值(即如果elem7 =“BA elem8 =”03“我想要”03 “输出”

没有多个匹配的危险,因此如果属性为“BA”,则不会有“DA”属性,但值可能出现在任何元素中

我查看了属性:: tag,但我不确定这是否能满足我的需求。

任何帮助非常感谢

2 个答案:

答案 0 :(得分:3)

我假设您的属性的名称形式为 elemN ,其中 N = 1,2,3 ...... , 他们是相应的订单。

以下XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="text" />
    <xsl:template match="/SI">
        <xsl:choose>
            <xsl:when test="some $i in @* satisfies $i='DA'">
                <xsl:text>DA</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="attr" select="concat('elem', xs:decimal(substring-after(@*[.='BA']/name(), 'elem')) + 1)" />
                <xsl:value-of select="@*[name() = $attr]" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

应用于以下输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<SI elem1="TI" elem2="FN" elem3="4099450222" elem4="TM" elem5="4094110000" elem6="MT" elem7="SP" elem8="MC" elem9="DS" elem10="DA" elem11="16" />

DA作为输出。

并应用于以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<SI elem1="TI" elem2="FN" elem3="4099450222" elem4="TM" elem5="4094110000" elem6="MT" elem7="BA" elem8="03" elem9="DS" elem10="DAs" elem11="16" />

03作为输出。

修改

这是XSLT 1.0版本(在Altova XMLSpy下测试):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:apply-templates select="SI/@*" />
    </xsl:template>

    <xsl:template match="@*">
        <xsl:choose>
        <xsl:when test=". = 'DA'">
            <xsl:text>DA</xsl:text>     
        </xsl:when>
        <xsl:when test=".='BA'">
            <xsl:variable name="attr" select="concat('elem', substring-after(name(), 'elem') + 1)" />
            <xsl:value-of select="/SI/@*[name() = $attr]" />
        </xsl:when>
        <xsl:otherwise/>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:2)

  

如果任何属性为“DA”,或者值为,我需要输出为“DA”   如果任何属性是“BA”,则下一个属性(即,如果elem7 =“BA   elem8 =“03”我想要“03”输出)

     

没有多重匹配的危险,所以如果属性是“BA”,   没有“DA”属性,但值可能出现在任何属性中   元件

此单个XPath表达式生成所需值

  string(/*/@*[. = 'DA']
        |
         /*/@*[name()
              =
               concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
         )

以下是完整转型:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "string(/*/@*[. = 'DA']
            |
             /*/@*[name()
                  =
                   concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
             )"/>
 </xsl:template>
</xsl:stylesheet>

可以看出,此转换只是评估XPath表达式并将评估结果复制到输出中。

在此XML文档上应用转换时(第二种情况):

<SI elem1="TI"
    elem2="FN"
    elem3="4099450222"
    elem4="TM"
    elem5="4094110000"
    elem6="MT"
    elem7="BA"
    elem8="03"
    elem9="DS"
    elem10="DD"
    elem11="16"/>

结果是

03

对最初提供的XML文档(第一种情况)应用相同的转换时:

<SI elem1="TI"
    elem2="FN"
    elem3="4099450222"
    elem4="TM"
    elem5="4094110000"
    elem6="MT"
    elem7="SP"
    elem8="MC"
    elem9="DS"
    elem10="DA"
    elem11="16"/>

再次生成想要的正确结果

DA

<强>解释

正确使用XPath union 运算符|以及函数string()substring-after()name()`concat()