有沒有辦法根據之前節點的其他屬性來定義屬性?(請原諒我的術語,我不經常使用 xslt)。
我得到了一些包含層末端深度的土壤層資料。需要的是特定組的層的開始深度(頂部)。
我的第一次嘗試是將組的第一層設為 top = 0。下一層獲得前一層的“DEPTHFROM”= DEPTHTO。
也許一個例子會澄清一點:
一個看起來像這樣的 XML 資料塊(一些土壤層):
<ZONES>
<ZONE LAYER_DESC="Flysand unchained" DEPTHTO="0.30" GROUP="1"/>
<ZONE LAYER_DESC="Flysand unchained" DEPTHTO="1.10" GROUP="1"/>
<ZONE LAYER_DESC="Flysand unchained" DEPTHTO="1.40" GROUP="1"/>
<ZONE LAYER_DESC="Flysand unchained" DEPTHTO="1.70" GROUP="1"/>
<ZONE LAYER_DESC="Drifting sand" DEPTHTO="1.80" GROUP="1"/>
<ZONE LAYER_DESC="Drifting sand" DEPTHTO="2.20" GROUP="1"/>
<ZONE LAYER_DESC="Drifting sand" DEPTHTO="2.60" GROUP="1"/>
<ZONE LAYER_DESC="Sand unchained" DEPTHTO="0.30" GROUP="2"/>
<ZONE LAYER_DESC="Sand unchained" DEPTHTO="1.10" GROUP="2"/>
<ZONE LAYER_DESC="Sand unchained" DEPTHTO="1.40" GROUP="2"/>
<ZONE LAYER_DESC="Sand unchained" DEPTHTO="1.70" GROUP="2"/>
<ZONE LAYER_DESC="fine sand" DEPTHTO="1.80" GROUP="2"/>
<ZONE LAYER_DESC="fine sand" DEPTHTO="2.20" GROUP="2"/>
<ZONE LAYER_DESC="fine sand" DEPTHTO="2.60" GROUP="2"/>
</ZONES>
使用 xslt(使用 xslt 1.0 引擎)所需的文本輸出可能如下所示:
(LAYER_DESC, 'DEPTHFROM'-> calculated from DEPTHTO from node above of specific layer group), quotes are not required
"Flysand unchained" "0.00"
"Flysand unchained" "0.30"
"Flysand unchained" "1.10"
"Flysand unchained" "1.40"
"Drifting sand" "1.70"
"Drifting sand" "1.80"
"Drifting sand" "2.20"
"Sand unchained" "0.00"
"Sand unchained" "0.30"
"Sand unchained" "1.10"
"Sand unchained" "1.40"
"fine sand" "1.80"
"fine sand" "2.20"
我更習慣于資料庫操作,在那里我可能會為該任務使用一些行計數器,在那里不會很瘋狂。
親切的問候和感謝每一個想法,生病繼續搜索。
uj5u.com熱心網友回復:
XSLT 1.0
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="ZONE">
<xsl:value-of select="@LAYER_DESC"/>
<xsl:text> </xsl:text>
<xsl:variable name="groupId" select="@GROUP"/>
<xsl:variable name="precedingZone" select="preceding-sibling::ZONE[@GROUP = $groupId][1]"/>
<xsl:choose>
<xsl:when test="$precedingZone">
<xsl:value-of select="$precedingZone/@DEPTHTO"/>
</xsl:when>
<xsl:otherwise>0.00</xsl:otherwise>
</xsl:choose>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
輸出
Flysand unchained 0.00
Flysand unchained 0.30
Flysand unchained 1.10
Flysand unchained 1.40
Drifting sand 1.70
Drifting sand 1.80
Drifting sand 2.20
Sand unchained 0.00
Sand unchained 0.30
Sand unchained 1.10
Sand unchained 1.40
fine sand 1.70
fine sand 1.80
fine sand 2.20
uj5u.com熱心網友回復:
您想在前一個兄弟軸上找到第一個(最近的)元素,然后從那里讀取 DEPTHTO 屬性。
所以:previous-sibling::ZONE[1]/@DEPTHTO
把這些精選的表情想象成海盜地圖上的方向:面對棕櫚樹走 20 步,然后面對鋸齒狀的巖石走 10 步,然后向下挖 6 英尺以找到埋藏的寶藏。
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="ZONES/ZONE" />
</xsl:template>
<xsl:template match="ZONE">
<xsl:text>"</xsl:text>
<xsl:value-of select="@LAYER_DESC" />
<xsl:text>" "</xsl:text>
<xsl:value-of select="preceding-sibling::ZONE[1][@GROUP=current()/@GROUP]/@DEPTHTO" />
<xsl:if test="not(preceding-sibling::ZONE[1][@GROUP=current()/@GROUP]/@DEPTHTO)">0.00</xsl:if>
<xsl:text>"
</xsl:text>
</xsl:template>
</xsl:transform>
輸出:
"Flysand unchained" "0.00"
"Flysand unchained" "0.30"
"Flysand unchained" "1.10"
"Flysand unchained" "1.40"
"Drifting sand" "1.70"
"Drifting sand" "1.80"
"Drifting sand" "2.20"
"Sand unchained" "0.00"
"Sand unchained" "0.30"
"Sand unchained" "1.10"
"Sand unchained" "1.40"
"fine sand" "1.70"
"fine sand" "1.80"
"fine sand" "2.20"
我認為原始請求的輸出沒有考慮@GROUP?或者也許是我的錯誤。
上面的答案很少假設輸入的規則性。它不假定每個元素都是一個 ZONE,或者每個 ZONE 都具有所有預期的屬性。如果您更確定輸入,則編碼可以做出假設。例如:
<xsl:choose>
<xsl:when test="@GROUP=preceding-sibling::*[1]/@GROUP">
<xsl:value-of select="preceding-sibling::*[1]/@DEPTHTO"/>
</xsl:when>
<xsl:otherwise>0.00</xsl:otherwise>
</xsl:choose>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/471904.html
