给定一个节点,例如。
<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"属性,但这些值可能出现在任何元素中
我已经研究了属性::标签,但我不确定这是否能满足我的需求。
任何帮助非常感谢
我假设您的属性具有 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>
如果任何属性是"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 文档上应用转换时(第 2 种情况):
<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()
的函数。