Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-跨祖先的上一个节点,计数错误_Xml_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

Xml XSLT-跨祖先的上一个节点,计数错误

Xml XSLT-跨祖先的上一个节点,计数错误,xml,xslt,xpath,xslt-2.0,Xml,Xslt,Xpath,Xslt 2.0,我有一些XML,如下所示: <layout> <table> <tbody> <tr> <ref id="stock1" class="pile stock"/> </tr> <tr>

我有一些XML,如下所示:

<layout>
    <table>
            <tbody>
                    <tr>
                            <ref id="stock1" class="pile stock"/>
                    </tr>
                    <tr>
                            <ref id="cascade1" class="pile"/>
                            <ref id="cascade2" class="pile"/>
                    </tr>
            </tbody>
    </table>
</layout>
问题是我不总是得到正确的以前使用的卡计数。当在
ref
'stock1'时,它正确地表示到目前为止已经使用了0张卡,但当它到达
ref
'cascade1'时,它仍然表示已经使用了0张卡,即使
ref
'stock1'使用了24张卡。然后当它到达
ref
'cascade2'时,它突然说已经使用了25张卡,这是正确的(stock1'中有24张卡+cascade1'中有1张卡)。为什么以前使用的卡的数量在
ref
'cascade1'处不正确

编辑:yikes,这里是一些示例XML:

<game name="Klondike">
  <layout>
    <table>
        <tbody>
            <tr>
                <ref id="stock1" class="pile stock"/>
                <ref id="waste1" colspan="2" class="empty-pile"/>
                <ref id="foundation1" class="empty-pile"/>
                <ref id="foundation2" class="empty-pile"/>
                <ref id="foundation3" class="empty-pile"/>
                <ref id="foundation4" class="empty-pile"/>
            </tr>
            <tr>
                <ref id="cascade1" class="pile"/>
                <ref id="cascade2" class="pile"/>
                <ref id="cascade3" class="pile"/>
                <ref id="cascade4" class="pile"/>
                <ref id="cascade5" class="pile"/>
                <ref id="cascade6" class="pile"/>
                <ref id="cascade7" class="pile"/>
            </tr>
        </tbody>
    </table>
  </layout>
  <state id="start">
    <foundation id="foundation1" />
    <foundation id="foundation2" />
    <foundation id="foundation3" />
    <foundation id="foundation4" />
    <cascade id="cascade1">
      <card suit="random" number="random" faceup="true"/>
    </cascade>
    <cascade id="cascade2">
      <card suit="random" number="random"/>
      <card suit="random" number="random" faceup="true"/>
    </cascade>
    ...other cascades...
    <waste id="waste1" />
    <stock id="stock1">
      <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
        <card suit="random" number="random"/>
    </stock>
  </state>
</game>

…其他瀑布。。。

我认为这一切都取决于当前模板上下文中代码片段的放置位置以及由此导致的
position()
的错误使用。如果您在
ref
节点上进行迭代,则上面的片段可以正常工作,如果您在这些节点上进行匹配,则不会正常工作

例如,在这种情况下:

 <xsl:template match="//ref">
 <!-- your fragment -->
 </xsl:template>

或者更好,更改模板上下文,以便可以使用
position()

非常不清楚的问题。XML文档中没有“卡片”。你说的“卡片”是什么意思?这真的是您正在谈论的XML文档吗?请编辑您的问题并加以改进。好吧,@所以我们都是“天才”,我们可以从您的XSLT代码推断XML输入…但您至少可以,显示模板上下文。如果您先编写
/layout
,然后编写
/carden
,则表示您的XML文档格式不正确。我在问题中添加了示例XML。您已更新了问题,但您既没有对我的答案进行评论,也没有显示更多当前使用的模板。
 <xsl:template match="//ref">
 <!-- your fragment -->
 </xsl:template>
    <xsl:variable name="curPos" 
                  select="count(../preceding-sibling::tr/ref 
                                | preceding-sibling::ref)"/>
    <xsl:value-of select="$curPos"/>
        <xsl:variable name="prevRefID"
            select="//layout//*/ref
                    [count(preceding-sibling::ref) &lt; $curPos]/@id"/>