如何提取以逗号分隔的元素的键?

时间:2011-04-12 16:54:57

标签: xml xslt

XML ...

<BaseElement>
     <AttributeList
     >ThreadId=1,ThreadName=Foo,ApplicationName=Bar</AttributeList>
</BaseElement>

我正在尝试在ThreadId ...

中提取值
<xsl:apply-templates select="AttributesList"/>

以上显示整个列表; ThreadId=1,ThreadName=Foo, ...

查看子字符串,但在本质上看起来相当固定。它需要动态,以便如果(在这种情况下为ThreadId更改为NewFangledThreadId,它将继续运行。

2 个答案:

答案 0 :(得分:2)

此转换已完全参数化且通用

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

 <xsl:param name="pAttrName" select="'AttributeList'"/>
 <xsl:param name="pKeyName" select="'ThreadId'"/>

 <xsl:template match="/">
  <xsl:value-of select=
   "substring-before(
           substring-after(concat(',',
                                   /*/*[name()=$pAttrName],
                                   ','
                                  ),
                            concat(',', $pKeyName, '=')
                            ),
                     ','
                     )
   "/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<BaseElement>
    <AttributeList
    >ThreadId=1,ThreadName=Foo,ApplicationName=Bar</AttributeList>
</BaseElement>

产生了想要的正确结果:

1

我们刚刚指定

 <xsl:param name="pKeyName" select="'ApplicationName'"/>

再次生成正确的结果

Bar

答案 1 :(得分:1)

以下样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="AttributeList">
        <xsl:value-of select="substring-before(substring-after(., '='), ',')"/>
    </xsl:template>
</xsl:stylesheet>

输出:

1

选择第一个=之后和第一个,之前的字符串部分。