[英]Check if the node set contains any value in XSLT
我需要一些XSLT語法的幫助。 這是我的場景,我有一個XML文件需要轉換為XML文件的不同外觀,我有幾個部分,如果特定節點集不包含任何值,則不應處理整個部分。
以下是XML的示例:
<Dates>
<Date>
<VALUE1></VALUE1>
<VALUE2></VALUE2>
<VALUE3></VALUE3>
<VALUE4></VALUE4>
<VALUE5>3333</VALUE5>
</Date>
<Date>
<VALUE1>AAAA</VALUE1>
<VALUE2></VALUE2>
<VALUE3>JJJJ</VALUE3>
<VALUE4></VALUE4>
<VALUE5>12345</VALUE5>
</Date>
</Dates>
這是我的XSLT,if語句不能正常工作
<xsl:for-each select="Level1/Level2/Level3">
<xsl:if test="@VALUE1!=''">
<MyDates>
<value_1>
<xsl:value-of select="VALUE1"/>
</value_1>
<value_2>
<xsl:value-of select="VALUE2"/>
</value_2>
<value_3>
<xsl:value-of select="VALUE3"/>
</value_3>
<value_4>
<xsl:value-of select="VALUE4"/>
</value_4>
</MyDates>
</xsl:if>
</xsl:for-each>
所以你可以看到我基本上希望所有節點(VALUE1,VALUE2,VALUE3等)都有值,否則不處理並轉到下一節
(如果你看不到XML的想法,我也做了一個屏幕截圖)
您正在嘗試匹配文檔中不存在的名稱為“Level1”,“Level2”等的xml元素。 然后,您正在尋找最后一個元素的VALUE1屬性。
我想你想要這樣的東西:
<xsl:for-each select="Dates">
<MyDates>
<xsl:for-each select="Date">
<xsl:if test="not(*[.=''])">
<MyDate>
<value_1>
<xsl:value-of select="VALUE1"/>
</value_1>
<value_2>
<xsl:value-of select="VALUE2"/>
</value_2>
<value_3>
<xsl:value-of select="VALUE3"/>
</value_3>
<value_4>
<xsl:value-of select="VALUE4"/>
</value_4>
</MyDate>
</xsl:if>
</xsl:for-each>
</MyDates>
</xsl:for-each>
只要相應Date元素中的每個值都不為空,這將添加一個新的MyDate元素。
它的作用是什么
*
匹配所有孩子。 [.='']
表示“空”。 最后,它包含了所有這些。 這意味着如果沒有任何子項為空,則if僅傳遞。 你還沒有很好地定義“節點有價值”是什么意思。
最有可能的是,您將考慮一個元素,它只有一個空格的文本子元素,沒有價值。 在這種情況下,下面是一個解決方案 :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Date[not(*[not(normalize-space())])]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
如果“日期”甚至包含一個沒有內容或只有空格的子元素,則“日期”元素的這個模板不會匹配 。
將此轉換應用於以下XML文檔時 :
<Dates> <Date> <VALUE1></VALUE1> <VALUE2> </VALUE2> <VALUE3></VALUE3> <VALUE4></VALUE4> <VALUE5>3333</VALUE5> </Date> <Date> <VALUE1>AAAA</VALUE1> <VALUE2>1</VALUE2> <VALUE3>JJJJ</VALUE3> <VALUE4>1</VALUE4> <VALUE5>12345</VALUE5> </Date> </Dates>
產生了正確的結果 :
<Date> <VALUE1>AAAA</VALUE1> <VALUE2>1</VALUE2> <VALUE3>JJJJ</VALUE3> <VALUE4>1</VALUE4> <VALUE5>12345</VALUE5> </Date>
我想你也可以這樣做。 而不是檢查節點。 VALUE1 / text()將檢查節點中是否有一些文本。 您可能希望確保沒有空白區域。 此外,您可以查看VALUE1元素是否具有子節點。
<xsl:if test="VALUE1/text()">
</xsl:if>
<xsl:if test="VALUE1/child::node()">
</xsl:if>
@是冗余的 - 它指的是XML屬性。
您正在嘗試測試元素,所以只需刪除@。
此外:
<xsl:for-each select="Level1/Level2/Level3">
<MyDates>
<xsl:if test="VALUE1!=''">
<value_1>
<xsl:value-of select="VALUE1"/>
</value_1>
</xsl:if>
<xsl:if test="VALUE2!=''">
<value_2>
<xsl:value-of select="VALUE2"/>
</value_2>
</xsl:if>
<xsl:if test="VALUE3!=''">
<value_3>
<xsl:value-of select="VALUE3"/>
</value_3>
</xsl:if>
<xsl:if test="VALUE4!=''">
<value_4>
<xsl:value-of select="VALUE4"/>
</value_4>
</xsl:if>
</MyDates>
<xsl:template match="Dates">
<table border="1">
<tr bgcolor="#9acd32"><th>NAME</th><th>INVALUE</th></tr>
<xsl:for-each select="Date">
<xsl:if test="(VALUE1 != '') and (VALUE2 != '') and (VALUE3 != '') and (VALUE4 != '') and (VALUE5 != '')" >
<tr><td>VALUE1</td><td><xsl:value-of select="VALUE1"></xsl:value-of></td></tr>
<tr><td>VALUE2</td><td><xsl:value-of select="VALUE2"></xsl:value-of></td></tr>
<tr><td>VALUE3</td><td><xsl:value-of select="VALUE3"></xsl:value-of></td></tr>
<tr><td>VALUE4</td><td><xsl:value-of select="VALUE4"></xsl:value-of></td></tr>
<tr><td>VALUE5</td><td><xsl:value-of select="VALUE5"></xsl:value-of></td></tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.