XML根元素中唯一字符串的Xpath

时间:2014-07-25 14:14:32

标签: xml xslt xpath

XML格式是这样的:

<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type='text/xsl' href='stylesheet.xsl'?>
<!--

Test case ID: C:\Me\z\d\e\t\w.ts
Result Test:PASSED      
balbalbalbalbalbalbalbalbl
***********************************************************************************************/
-->
<Results IsFinished="No">
....

我是XPath定义的新手,我需要在样式表中为上面评论部分中的测试用例ID提供一个变量。

我对变量的试用看起来像这样:

<xsl:param name="text" select="/"/>
<xsl:variablename="TestScript" select="substring-after($text, 'Test case ID:')"/>

...

此变量稍后在模板中使用:

<xsl:template name="test_name">


<xsl:param name="text" select="."/>

        <xsl:choose>
            <xsl:when test="contains($text, 'Test case ID:')">

                <xsl:call-template name="break_2">

                    <xsl:with-param name="text" select="$TestScript"/>

                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise> </xsl:otherwise>
        </xsl:choose>


    </xsl:template>

虽然稍后在调用模板时变量的值不会显示,但两者都找不到声明它的方法全局(如上面显示的试用版,因为本地工作完美)。

在模板中本地声明的工作原理:

    <xsl:param name="text" select="."/>

    <xsl:choose>
        <xsl:when test="contains($text, 'Test case ID:')">
            <xsl:variable name="TestScript" select="substring-after($text, 'Test case ID:')"/>

            <xsl:call-template name="break_2">

                <xsl:with-param name="text" select="$TestScript"/>

            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise> </xsl:otherwise>
    </xsl:choose>


</xsl:template>

如何全局设置该变量?

2 个答案:

答案 0 :(得分:0)

如果要提取的字符串始终位于文档的第一条注释中,则可以执行以下操作:

<xsl:variablename="TestScript" select="substring-after(/comment()[1], 'Test case ID:')"/>

但是,这会在Test Case ID:

之后给出评论中的所有内容
 C:\Me\z\d\e\t\w.ts
Result Test:PASSED      
balbalbalbalbalbalbalbalbl
***********************************************************************************************/

如果你只想要这个ID,请将其包装在另一个substring-beforenormalize-space中以删除空格和换行符:

<xsl:variablename="TestScript" 
    select="normalize-space(substring-before(substring-after(/comment()[1], 'Test case ID:'), 'Result'))"/>

答案 1 :(得分:0)

要将测试用例ID转换为全局变量,请将其放在样式表的顶部,在任何模板之外:

<xsl:variable name="caseID" select="substring-before(substring-after(/comment()[1], 'Test case ID: '), '&#10;')"/>

这将从第一个作为根节点子节点的注释中提取“测试用例ID:”和后续换行之间的子字符串。

我不确定如果你拥有它,你将如何使用这个变量(你的样式表缺少那个部分)。