Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Xslt 是否显示来自以下同级/子节点的前一同级的值?_Xslt_Xpath - Fatal编程技术网

Xslt 是否显示来自以下同级/子节点的前一同级的值?

Xslt 是否显示来自以下同级/子节点的前一同级的值?,xslt,xpath,Xslt,Xpath,基于此XML,我试图为每个DOCREF显示一个表,其中包含一行,该行还显示STEP2/标题,其中引用等于ID。我可以在DOCREF/@REFERENCE=STEP2/@ID的位置进行此操作,但我遇到的问题是,有人要求STEP2/标题也为每个STEP3元素显示,直到出现新的步骤2元素,然后它将显示所有步骤3,直到它再次更改,依此类推 <WORKCARD> <STSBODY> <DOCREFS> <DOCREF REFERENCE="

基于此XML,我试图为每个DOCREF显示一个表,其中包含一行,该行还显示STEP2/标题,其中引用等于ID。我可以在DOCREF/@REFERENCE=STEP2/@ID的位置进行此操作,但我遇到的问题是,有人要求STEP2/标题也为每个STEP3元素显示,直到出现新的步骤2元素,然后它将显示所有步骤3,直到它再次更改,依此类推

<WORKCARD>
  <STSBODY>
    <DOCREFS>
      <DOCREF REFERENCE="123" VALUE="Ref1"/>        
      <DOCREF REFERENCE="456" VALUE="Ref2"/>
      <DOCREF REFERENCE="789" VALUE="Ref3"/>
    </DOCREFS>
  </STSBODY>
  <BODY>
    <ITEMS>
      <ITEM>
        <XML>
          <STEP2 ID="123">
            <TITLE>Test1</TITLE>
          </STEP2>
        </XML>
      </ITEM>
      <ITEM>
        <ITEMXML>
          <XML>
            <STEP3 ID=456>Step info goes here</STEP3>
          </XML>
        </ITEMXML>
      </ITEM>
      <ITEM>
        <ITEMXML>
          <XML>
            <STEP2 ID=789>Test2</STEP3>
          </XML>
        </ITEMXML>
      </ITEM>
    </ITEMS>
  </BODY>
</WORKCARD>

测试1
步骤信息在这里
测试2
我正在修改现有的XSLT。这是我正在使用的部分,你可以看到我的各种尝试并没有满足我的需要

<xsl:key name="step2Ref" match="STEP2" use="@ID" />

<xsl:when test="DOCREF[@TASK_CARD_ITEM > $item]">
  <xsl:for-each select="DOCREF[@TASK_CARD_ITEM > $item and not($doctype = 'NDT' and key('refItem', @TASK_CARD_ITEM)/descendant::L1ITEM[@ID] and not(key('refItem',@TASK_CARD_ITEM)/descendant::L2ITEM))]">
    <xsl:sort select="@TASK_CARD_ITEM" data-type="number" />
    <!--<xsl:call-template name="subtaskitemrow"/>-->

    <fo:table-row>
      <fo:table-cell number-columns-spanned="6" border="solid 1pt red">
        <fo:block>
          <!-- this displays the correct info when there is a matching STEP2/@ID-->              
          <xsl:value-of select="key('step2Ref', @REFERENCE)/TITLE" />***                  
          <!--This gets the STEP2/TITLE where STEP2/@ID = @REFERENCE-->
          <xsl:value-of select="//STEP2/@ID" />+++
          <xsl:value-of select="//ITEM/@TASK_CARD_ITEM" />***
          <xsl:value-of select="@TASK_CARD_ITEM"/>+++
          <xsl:variable name="tcitem"><xsl:value-of select="@TASK_CARD_ITEM" /></xsl:variable>
          <xsl:value-of select="//ITEM[$tcitem]/@TASK_CARD_ITEM" />***
          <!--preceding-sibling STEP2/@ID-->
        </fo:block>
      </fo:table-cell>
  </fo:table-row>        
  </xsl:for-each>    
</xsl:when>  

***                  
+++
***
+++
***
我给自己写的一些笔记是:

  • 在文档引用中循环时,我需要为每个文档显示STEP2/标题,直到STEP2/标题更改,然后显示新的
  • 我需要匹配STEP3前面的兄弟STEP2的@ID
请帮忙

预计到达时间:

此示例所需的输出(xml文本与原始帖子略有不同)如下:

  • 测试1
  • 测试1
  • 测试2

  • 因此,对于第一个和第二个DOCREF,它将显示第一步2中的标题,第三个DOCREF将显示第二步2中的标题。

    您的XML文档格式不正确,而且更重要的是,第二个
    没有
    。假设可以更正为:

    <WORKCARD>
      <STSBODY>
        <DOCREFS>
          <DOCREF REFERENCE="123" VALUE="Ref1"/>        
          <DOCREF REFERENCE="456" VALUE="Ref2"/>
          <DOCREF REFERENCE="789" VALUE="Ref3"/>
        </DOCREFS>
      </STSBODY>
      <BODY>
        <ITEMS>
          <ITEM>
            <XML>
              <STEP2 ID="123">
                <TITLE>Test1</TITLE>
              </STEP2>
            </XML>
          </ITEM>
          <ITEM>
            <ITEMXML>
              <XML>
                <STEP3 ID="456">Step info goes here</STEP3>
              </XML>
            </ITEMXML>
          </ITEM>
          <ITEM>
            <ITEMXML>
              <XML>
                <STEP2 ID="789">
                    <TITLE>Test2</TITLE>
                </STEP2>
              </XML>
            </ITEMXML>
          </ITEM>
        </ITEMS>
      </BODY>
    </WORKCARD>
    

    请注意,假设第一个
    具有相关的

    您可以包括一些所需的输出吗?另外:
    中带有前缀
    /
    select
    语句看起来有点可疑,因为它们基本上扫描整个文档而不考虑上下文。这就是你想要的吗?嗨,谢谢你的回复!//是我绝望的尝试,因为我变得相当沮丧:(我将在原始问题中添加所需的输出。谢谢!成功了!非常感谢。现在,我想再多了解一点,您提供的内容应该会有所帮助:)
    <xsl:key name="step2Ref" match="STEP2" use="@ID" />
    ...
    <xsl:template match="DOCREF">
    <tr>
        <!-- DOCREF VALUE-->
        <td><xsl:value-of select="@VALUE" /></td>
        <!-- DOCREF REFERENCE -->
        <td><xsl:value-of select="@REFERENCE" /></td>
    
        <xsl:variable name="ref">
            <xsl:choose>
                <xsl:when test="key('step2Ref', @REFERENCE)">
                    <xsl:value-of select="@REFERENCE" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="preceding-sibling::DOCREF[key('step2Ref', @REFERENCE)][1]/@REFERENCE" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
    
        <!-- REFERENCE USED FOR KEY -->
        <td><xsl:value-of select="$ref" /></td>
        <!-- RETRIEVED TITLE -->
        <td><xsl:value-of select="key('step2Ref', $ref)/TITLE" /></td>
    </tr>
    </xsl:template>
    
    Ref1    123 123 Test1
    Ref2    456 123 Test1
    Ref3    789 789 Test2