如何获取此xml标记属性值的前一个兄弟计数?

时间:2015-06-12 07:15:38

标签: xml xslt

我想获得有价值1234的ProcessId计数。当前的问题元素是PlayBack

<WorkFlow>
<Step>
<PlayBack>
<AppInfo ProcessId="1234"/>
</PlayBack>
</Step>
<Step>
<PlayBack>
<AppInfo ProcessId="1234"/>
</PlayBack>
</Step>
<Step>
<PlayBack>
<AppInfo ProcessId="1284"/>
</PlayBack>
</Step>
</WorkFlow>

我试过这段代码,但不知道我在哪里做错了

Here $ActivePID=1234 and $AppVaribale is some value i need to print if the ProcessID is unique
 <xsl:if test="((count(preceding-sibling::Step/PlayBack/AppInfo[@ProcessID= $ActivePID])= 0) and (GeneralInfo/@AdaptorID = 1))">
  <xsl:text>&#xa;</xsl:text>
  <xsl:value-of select ="$AppVaribale"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:if>

3 个答案:

答案 0 :(得分:3)

如果您确实位于PlayBack元素上,那么您需要的表达式是

<xsl:if test="count(../preceding-sibling::Step/PlayBack/AppInfo[@ProcessId = $ActivePID]) = 0">

请注意使用..获取父Step元素,因为PlayBack本身没有任何兄弟姐妹。另请注意,您当前的表达式是ProcessID而非ProcessId(XML区分大小写)

然而,这实际上并不是最有效的方法。也许您需要阅读一种名为Muenchian Grouping的技术,该技术可用于查找每个值的第一次出现。

您可以像这样定义一个键

<xsl:key name="Processes" match="PlayBack" use="AppInfo/@ProcessId" />

然后你的表达就像这样写了

<xsl:if test="generate-id() = generate-id(key('Processes', $ActivePID)[1])">

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:key name="Processes" match="PlayBack" use="AppInfo/@ProcessId" />
    <xsl:template match="PlayBack">
        <xsl:variable name="ActivePID" select="AppInfo/@ProcessId" />
        <xsl:if test="generate-id() = generate-id(key('Processes', $ActivePID)[1])">
            <xsl:text>&#xa;</xsl:text>
            <xsl:value-of select ="'Test'"/>
            <xsl:text>&#xa;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

请注意,如果您确实想要查找仅发生一次的元素(而不是每个元素的第一次出现),则可以将表达式更改为:

<xsl:if test="count(key('Processes', $ActivePID)[1]) = 1">

答案 1 :(得分:1)

@Jak,

使用XSL以下

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name = "Count" >
<xsl:value-of select = "count(WorkFlow/Step/PlayBack/AppInfo[@ProcessId =  1234])"/>
</xsl:variable>
<test>
<xsl:value-of select ="$Count"/>
</test>
</xsl:template>
</xsl:stylesheet>

只是为了确保它正在工作..我正在添加计数值变量,即在Test标签之间计数。

答案 2 :(得分:1)

你说“当前焦点元素是PlayBack”,但是该元素没有任何名为Step的兄弟姐妹(事实上它根本没有任何先前的兄弟元素)。您错过了..

count(../preceding-sibling::Step/PlayBack/AppInfo[@ProcessID=$ActivePID])