如何使用XSL查找确切的xml内容

时间:2015-01-28 20:21:15

标签: xml xslt substring

我希望你能帮我解决我的问题

我需要得到我的字符串所在节点的local-name()

var str="the world is complex";

<firsttag>The world is complex.</firsttag>
<secondtag>The world is complex</secondtag>
...

这是我的代码:

<xsl:if test="$str">
        <xsl:variable name="nodename">
        <xsl:value-of select="local-name([contains(.,$str)])"/>
    </xsl:variable> 
</xsl:if>

但是这会返回<firsttag>的本地名称,即使它包含一个点(。),我被告知我可以使用substring-beforesubstring-after进行验证以获取节点之前和之后没有任何内容的确切字符串,但我担心如果我在不同的节点中有重复的内容,这可能会产生相同的结果,但这不是我现在关注的问题。

1 个答案:

答案 0 :(得分:0)

你的问题并不完全清楚。鉴于以下测试输入

<input>
    <firsttag>The world is complex.</firsttag>
    <secondtag>The world is complex</secondtag>
</input>

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:param name="str" select="'The world is complex'"/>

<xsl:template match="/">
    <output>
        <xsl:for-each select="//*[.=$str]">
            <elem-name>
                <xsl:value-of select="name()"/>
            </elem-name>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="utf-8"?>
<output>
   <elem-name>secondtag</elem-name>
</output>

如果您可以确定只有一个输入元素(最多)与条件匹配(或者如果您只对第一个元素的名称感兴趣),则可以减少代码:

<xsl:template match="/">
    <output>
        <xsl:value-of select="name(//*[.=$str])"/>
    </output>
</xsl:template>

获得:

<?xml version="1.0" encoding="utf-8"?>
<output>secondtag</output>

请注意,XML区分大小写; “世界很复杂”的字符串参数匹配包含“世界是复杂的”的元素。