2

给定一个节点,例如。

<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”属性,但是值可以出现在任何元素中

我已经查看了 attribute:: 标记,但我不确定这是否能满足我的需求。

非常感谢任何帮助

4

2 回答 2

3

I made an assumption that your attributes has names in form of elemN where N = 1,2,3..., and they are ordered accordingly.

The following 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>

applied to the following input 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" />

gives DA as the output.

And applied to the following 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" />

gives 03 as the output.

EDIT

Here's the XSLT 1.0 version (tested under 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>
于 2012-06-14T11:22:46.487 回答
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联合运算符和|函数string(),substring-after()和.name()`concat()

于 2012-06-14T11:49:12.250 回答