2012-04-25 50 views
0

我有2個序列,一個是從1到10,另一個是1到3. 如何比較第二個序列和第一個序列以測試前三個項目是否相同?比較xslt中的2個序列

+0

您可以顯示使用XML,因爲不清楚序列是否是元素列表,或者只是包含逗號分隔列表的文本元素。此外,還會顯示您期望的結果以及您所做的任何XSLT遠也會有所幫助。謝謝! – 2012-04-25 10:06:38

回答

0

假設您有兩個變量seq1seq2您可以簡單地測試<xsl:if test="$seq1[1] eq $seq2[1] and $seq1[2] eq $seq2[2] and $seq1[3] eq $seq2[3]">...</xsl:if>

1

使用此短XPath表達式

deep-equal(subsequence($seq1, 1, count($seq2)), $seq2) 

當評估它產生true()恰好如果第二序列是第一的起始序列。這兩個序列可以包含任何XDM項目的混合,包括節點。

這裏是一個充分的論證

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:variable name="vSeq1" select= 
     "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"/> 

    <xsl:variable name="vSeq2" select= 
     "1, 2, 3"/> 

    <xsl:variable name="vSeq3" select="/*/*"/> 
    <xsl:variable name="vSeq4" select="/*/*[position() gt 5]"/> 

    <xsl:variable name="vSeq5" select="/*/*"/> 
    <xsl:variable name="vSeq6" select="/*/*[position() le 5]"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "deep-equal(subsequence($vSeq1, 1, count($vSeq2)), $vSeq2)"/> 
    =========== 
    <xsl:sequence select= 
    "deep-equal(subsequence($vSeq3, 1, count($vSeq4)), $vSeq4)"/> 
    =========== 
    <xsl:sequence select= 
    "deep-equal(subsequence($vSeq5, 1, count($vSeq6)), $vSeq6)"/> 
</xsl:template> 
</xsl:stylesheet> 

當下面的XML文檔應用這種轉變:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

想要的,正確的結果產生:

true 
=========== 
false 
=========== 
true 
+0

是這是有用的:-) – 2012-04-30 09:52:51

+0

@XSLT_FRESHER:我很高興這個答案對你有用。爲什麼不*接受*(通過點擊最佳答案旁邊的複選標記)? :) – 2012-04-30 11:55:56