我需要在遞回回圈中進行查找。例如下面是一個xml:
<?xml version="1.0" encoding="utf-8"?>
<AggregatedData>
<wd:Report_Data xmlns:wd="urn:com.workday/bsvc">
<wd:Report_Entry>
<wd:num>1</wd:num>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:num>2</wd:num>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:num>4</wd:num>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:num>5</wd:num>
</wd:Report_Entry>
</wd:Report_Data>
<root>
<row>
<my_num>6</my_num> --->> Can be any number
</row>
</root>
</AggregatedData>
現在,如果可用,我需要在 Report_Data 中查找 my_num。如果找到,那么我需要從 my_num 中減去 1,然后再次查找直到“未找到”
例如,如果 my_num 為 6,我需要從 6(即 5)中減去 1,然后查找是否在 report_Data 中找到 5。如果找到,現在需要從 5 中減去 1(即 4),然后再次在 report_data 中查找 4。繼續迭代這個回圈直到“找不到”
預期輸出:未找到:3
以下是我目前能夠準備的 xslt,但面臨錯誤 xsl:template must be at top level,但我無法重新構建 xslt:
<xsl:template match="AggregatedData">
<FinalData>
<xsl:iterate select="*">
<xsl:param name="numMap" as="map(xs:integer,element(wd:Report_Entry))" select="map{}"/>
<xsl:choose>
<xsl:when test="self::wd:Report_Data">
<xsl:next-iteration>
<xsl:with-param name="numMap"
select="fold-left(
wd:Report_Entry/copy-of(),
map{},
function($map,$entry) {
let $key:=xs:integer($entry/wd:num) return
if ($key)
then map:put($map,$key,$entry)
else
$map})"
/>
</xsl:next-iteration>
</xsl:when>
<xsl:when test="self::root">
<xsl:for-each select="row/copy-of()">
<rows>
<xsl:copy-of select="*"/>
<splitExistFlag>
<xsl:choose>
<xsl:when test="exists($numMap(current()/xs:integer(my_num - 1))/wd:num)">
<xsl:value-of select="'found'"/>
------<< Need a recursive loop here after further subtracting 1 from my_num >>------
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'Not found'"/>
</xsl:otherwise>
</xsl:choose>
</splitExistFlag>
</rows>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</xsl:iterate>
</FinalData>
</xsl:template>
</xsl:樣式表>
請幫忙!
uj5u.com熱心網友回復:
你想得太程式化了:
例如,如果 my_num 為 6,我需要從 6(即 5)中減去 1,然后查找是否在 report_Data 中找到 5。如果找到,現在需要從 5 中減去 1(即 4),然后再次在 report_data 中查找 4。繼續迭代這個回圈直到“找不到”
嘗試更明確地表達它,你會發現撰寫代碼更容易。
據我所知,您希望小于的最高整數my_num不存在于report_Data. 也就是說,你想要
max((1 to my_num - 1)[not(. = //wd:num)])
或者如果數字要大得多,則執行速度可能要快一兩微秒:
reverse(1 to my_num - 1)[not(. = //wd:num)][1]
uj5u.com熱心網友回復:
我無法遵循您示例的邏輯。以下是您可能能夠適應的簡單內容:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday/bsvc"
exclude-result-prefixes="wd">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="entry" match="wd:Report_Entry" use="wd:num" />
<xsl:template match="/AggregatedData">
<xsl:variable name="data" select="wd:Report_Data" />
<results>
<xsl:for-each select="root/row">
<row start="{my_num}">
<xsl:for-each select="reverse(1 to my_num)">
<result n="{.}">
<xsl:if test="not(key('entry', string(.), $data))">Not </xsl:if>
<xsl:text>found</xsl:text>
</result>
</xsl:for-each>
</row>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
應用于您的(更新的)示例輸入,這將產生:
結果
<?xml version="1.0" encoding="UTF-8"?>
<results>
<row start="6">
<result n="6">Not found</result>
<result n="5">found</result>
<result n="4">found</result>
<result n="3">Not found</result>
<result n="2">found</result>
<result n="1">found</result>
</row>
</results>
演示:https : //xsltfiddle.liberty-development.net/3MXNWN3/1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/368129.html
