我想获得有价值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>
</xsl:text>
<xsl:value-of select ="$AppVaribale"/>
<xsl:text>
</xsl:text>
</xsl:if>
答案 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>
</xsl:text>
<xsl:value-of select ="'Test'"/>
<xsl:text>
</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])