基于这个XML,我试图显示一个表,每个DOCREF都有一行,它还显示了REFERENCE等于ID的STEP2 / TITLE。我可以在DOCREF / @REFERENCE = STEP2 / @ ID的地方工作,但是遇到麻烦的是,请求STEP2 / TITLE也显示每个STEP3元素,直到有一个新的STEP2元素,然后它将显示所有STEP3,直到它再次发生变化,等等。
<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>
我正在修改现有的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>
我写给自己的一些笔记是:
请帮帮忙?
ETA:
此示例的所需输出(xml中的文本与原始帖子稍有不同)将是这样的:
因此,对于第一个和第二个DOCREF,它将显示第一个STEP2的标题,第三个DOCREF将显示第二个STEP2的标题。
答案 0 :(得分:1)
您的XML文档格式不正确,而且 - 更重要的是 - 第二个<STEP2>
没有<TITLE>
。假设它可以更正为:
<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>
您可以使用以下逻辑来检索所需的数据(出于测试目的,显示的内容超出了您的问题所需的数据):
<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
请注意,假设第一个<DOCREF>
具有相关的<STEP2>
。