给定一个节点,例如
<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,但我不确定这是否能满足我的需求。
任何帮助非常感谢
答案 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()
。