【问题标题】:How do I extract the key of an element which has been comma delimited?如何提取以逗号分隔的元素的键?
【发布时间】:2011-04-12 16:54:56
【问题描述】:

XML...

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

我正在尝试提取 ThreadId 中的值...

<xsl:apply-templates select="AttributesList"/>

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

查看了子字符串,但本质上看起来相当固定。它需要动态,以便如果 key(在本例中为 ThreadId)更改为 NewFangledThreadId,它会继续运行。

【问题讨论】:

标签: xml xslt


【解决方案1】:

这种转换是完全参数化和通用的

<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

【讨论】:

    【解决方案2】:

    以下样式表:

    <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
    

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

    【讨论】:

    • 我需要匹配BaseElement,而不是AttributeList;其中 AttributeList 位于 BaseElement 中。
    • 没关系。你可以在任何你想要的地方匹配。我回答的重点是如何提取想要的文本:substring-before(substring-after(., '='), ',')
    • @Aaron - 从 BaseElement 的匹配中将其更改为:substring-before(substring-after(AttributeList, '='), ',')
    • +1 它在指定条件下工作,但本质上也显示为静态。即...如果我删除了尾随属性并且只有 ThreadId 属性,我必须更改 XSL。有没有办法通过索引来处理值?
    • @Aaron - 您描述的一般情况最好由某种标记器处理。请参阅问题 cmets 中的@Alejandro 链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多