gpt4 book ai didi

XSLT 前同级限制和解决方法

转载 作者:行者123 更新时间:2023-12-02 11:57:21 26 4
gpt4 key购买 nike

我遇到了前辈 sibling 的问题。这真的有效吗?

XSL 看起来像这样:

<stored-procedure id="search-algorithm-parent-child">
<xsl:stylesheet version="1.0" xmlns:spbc="urn:lsapps.spbcontext" xmlns:user="http://www.lodestarcorp.com" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|/|@*">
<query name="CMNUALGPARENTCHILD">
<sql>
SELECT
parent.UIDALGLIBPARENTDTL as UIDPARENT,
parent.PARENTCHANNELID as VMCHANNELNUMBER,
parent.UOMCODE as UOM,
child.CHILDDCFLOW AS DCFLOW,
FROM
##Q.NUALGLIBPARENTDTL parent,
##Q.NUALGLIBCHILDDTL child
WHERE
child.UIDALGLIBPARENTDTL = parent.UIDALGLIBPARENTDTL
AND parent.UIDALGLIBRARY = '<xsl:value-of select="@UIDALGLIBRARY"/>'
ORDER BY UIDPARENT
</sql>
</query>
</xsl:template>
</xsl:stylesheet>
</stored-procedure>

当我将上面的 XSL 传递给我的 asp 中的 LsdbCommand 时,我不知道 XML 是什么样子像这样:

var xmlTable5 = LsdbCommand("LSDB.search-algorithm-parent-child", PrefixParams1.valueOf());

我假设 XML 数据将是这样的(按 UIDPARENT 排序):

<CMNUALGPARENTCHILD>
<someNode>
<UIDPARENT>21</UIDPARENT>
<VMCHANNELNUMBER>123</VMCHANNELNUMBER>
<UOM>5<UOM>
<DCFLOW>R<DCFLOW>
</someNode>
<someNode>
<UIDPARENT>21</UIDPARENT>
<VMCHANNELNUMBER>123</VMCHANNELNUMBER>
<UOM>5<UOM>
<DCFLOW>R<DCFLOW>
</someNode>
...
</CMNUALGPARENTCHILD>

现在,我关心的是 UIDPARENT ..我确信结果将具有以下 UIDPARENT ..(按顺序)

21
21
21
81
81
81

现在,在 asp 中,我称之为

tTable5 = ProcessXsl(xmlTable5, XmlFreeFile("../zAlgorithmLibrary/AlgorithmParentChild.xslt"));

其中 AlgorithmParentChild.xslt 只是

<x:stylesheet version="1.0"
xmlns:x="http://www.w3.org/1999/XSL/Transform"
xmlns:i="urn:ls-i18n-formatter"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="http://www.lodestarcorp.com/user"
exclude-result-prefixes="x i ms user">

<x:param name="Portal">N</x:param>
<x:param name="Include">ALL</x:param>
<x:param name="OrderParams"></x:param>
<x:param name="FromParam"></x:param>
<x:param name="ROWPERPAGE">25</x:param>
<x:param name="AllowEdit"></x:param>

<x:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<x:template match="/">
<table class="FormTable">
<x:for-each select="//CMNUALGPARENTCHILD">
<tr>
<td>current <x:value-of select="@UIDPARENT"/></td>
<td>previous <x:value-of select="preceding-sibling::node()/@UIDPARENT"/></td>
<td>next <x:value-of select="following-sibling::node()/@UIDPARENT"/></td>
</tr>
</x:for-each>
</table>
</x:template>

<x:include href="../controls/MultiSortImages.xslt"/>
<x:include href="../controls/LockedColumns.xslt"/>
</x:stylesheet>

主表如下所示

current 21 previous  next 21 
current 21 previous 21 next 21
current 21 previous 21 next 81
current 81 previous 21 next 81
current 81 previous 21 next 81
current 81 previous 21 next

前三个结果似乎是正确的..但是为什么前置元素在第三次迭代后失败了?它应该返回以下内容:

current 21 previous  next 21 
current 21 previous 21 next 21
current 21 previous 21 next 81
current 81 previous 21 next 81
current 81 previous 81 next 81
current 81 previous 81 next

following-sibling 工作正常..previous-sibling 有任何已知的限制吗?您能建议任何解决方法吗?

请注意,我还尝试在前面附加 [position=1][position()] 或简单地 [1] sibling::node()/@UIDPARENT 但它仍然有相同的结果..

请理解,我是 ASP、XSLT、XSL 的新手......并且我只放置了代码片段,而不是整个代码。

我只是想了解 previous-sibling 是如何工作的......它的语法,关于它的一切......

最佳答案

W3C specification 中所述:

the preceding-sibling axis contains all the preceding siblings of the context node

它没有说的是它是相反的!您需要将 [position()=1] 谓词添加到 XPath 选择的末尾,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<x:stylesheet version="1.0"
xmlns:x="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="x">
<x:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<x:template match="CMNUALGPARENTCHILD">
<table>
<x:for-each select="UIDPARENT">
<tr>
<td>current <x:value-of select="."/></td>
<td>previous <x:value-of select="preceding-sibling::UIDPARENT[position()=1]"/></td>
<td>next <x:value-of select="following-sibling::UIDPARENT[position()=1]"/></td>
</tr>
</x:for-each>
</table>
</x:template>
</x:stylesheet>

我无法让您问题中的 XSL 正常工作。但这对我来说适用于你问题中的 XML。

编辑:从原始问题添加 XML 以供引用

<CMNUALGPARENTCHILD>
<UIDPARENT>21</UIDPARENT>
<UIDPARENT>21</UIDPARENT>
<UIDPARENT>21</UIDPARENT>
<UIDPARENT>81</UIDPARENT>
<UIDPARENT>81</UIDPARENT>
<UIDPARENT>81</UIDPARENT>
</CMNUALGPARENTCHILD>

关于XSLT 前同级限制和解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com