หากต้องการเปรียบเทียบสององค์ประกอบ (ประเภทสตริง) ใน XSLT

ฉันยังใหม่กับ XSLT ใครก็ได้ช่วยแนะนำวิธีเปรียบเทียบสององค์ประกอบที่มาจาก xml เนื่องจากสตริงค่าของพวกเขาคือ:

<OU_NAME>Vision Operations</OU_NAME> --XML code
<OU_ADDR1>90 Fifth Avenue</OU_ADDR1> --XML code

<xsl:choose>
    <xsl:when test="OU_NAME='OU_ADDR1'"> --comparing two elements coming from XML
        <!--remove if  adrees already contain  operating unit name
            <xsl:value-of select="OU_NAME"/> <fo:block/>-->
        <xsl:if test="OU_ADDR1 !='' ">
            <xsl:value-of select="OU_ADDR1"/>
            <fo:block/>
        </xsl:if>
        <xsl:if test="LE_ADDR2 !='' ">
            <xsl:value-of select="OU_ADDR2"/>
            <fo:block/>
        </xsl:if>
        <xsl:if test="LE_ADDR3 !='' ">
            <xsl:value-of select="OU_ADDR3"/>
            <fo:block/>
        </xsl:if>
        <xsl:if test="OU_TOWN_CITY !=''">
            <xsl:value-of select="OU_TOWN_CITY"/>,
            <fo:leader leader-pattern="space" leader-length="2.0pt"/>
        </xsl:if>
        <xsl:value-of select="OU_REGION2"/>
        <fo:leader leader-pattern="space" leader-length="3.0pt"/>
        <xsl:value-of select="OU_POSTALCODE"/>
        <fo:block/>
        <xsl:value-of select="OU_COUNTRY"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="OU_NAME"/>
        <fo:block/>
        <xsl:if test="OU_ADDR1 !='' ">
            <xsl:value-of select="OU_ADDR1"/>
            <fo:block/>
        </xsl:if>
        <xsl:if test="LE_ADDR2 !='' ">
            <xsl:value-of select="OU_ADDR2"/>
            <fo:block/>
        </xsl:if>
        <xsl:if test="LE_ADDR3 !='' ">
            <xsl:value-of select="OU_ADDR3"/>
            <fo:block/>
        </xsl:if>
        <xsl:if test="OU_TOWN_CITY !=''">
            <xsl:value-of select="OU_TOWN_CITY"/>,
            <fo:leader leader-pattern="space" leader-length="2.0pt"/>
        </xsl:if>
        <xsl:value-of select="OU_REGION2"/>
        <fo:leader leader-pattern="space" leader-length="3.0pt"/>
        <xsl:value-of select="OU_POSTALCODE"/>
        <fo:block/>
        <xsl:value-of select="OU_COUNTRY"/>
    </xsl:otherwise>
</xsl:choose>

person Vineet    schedule 13.04.2011    source แหล่งที่มา


คำตอบ (1)


ก่อนอื่น โค้ดยาวที่ให้มา:

    <xsl:choose>
        <xsl:when test="OU_NAME='OU_ADDR1'">   --comparing two elements coming from XML             
            <!--remove if  adrees already contain  operating unit name <xsl:value-of select="OU_NAME"/> <fo:block/>-->
            <xsl:if test="OU_ADDR1 !='' ">
                <xsl:value-of select="OU_ADDR1"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="LE_ADDR2 !='' ">
                <xsl:value-of select="OU_ADDR2"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="LE_ADDR3 !='' ">
                <xsl:value-of select="OU_ADDR3"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="OU_TOWN_CITY !=''">
                <xsl:value-of select="OU_TOWN_CITY"/>,
                <fo:leader leader-pattern="space" leader-length="2.0pt"/>
            </xsl:if>
            <xsl:value-of select="OU_REGION2"/>
            <fo:leader leader-pattern="space" leader-length="3.0pt"/>
            <xsl:value-of select="OU_POSTALCODE"/>
            <fo:block/>
            <xsl:value-of select="OU_COUNTRY"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="OU_NAME"/>
            <fo:block/>
            <xsl:if test="OU_ADDR1 !='' ">
                <xsl:value-of select="OU_ADDR1"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="LE_ADDR2 !='' ">
                <xsl:value-of select="OU_ADDR2"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="LE_ADDR3 !='' ">
                <xsl:value-of select="OU_ADDR3"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="OU_TOWN_CITY !=''">
                <xsl:value-of select="OU_TOWN_CITY"/>,
                <fo:leader leader-pattern="space" leader-length="2.0pt"/>
            </xsl:if>
            <xsl:value-of select="OU_REGION2"/>
            <fo:leader leader-pattern="space" leader-length="3.0pt"/>
            <xsl:value-of select="OU_POSTALCODE"/>
            <fo:block/>
            <xsl:value-of select="OU_COUNTRY"/>
        </xsl:otherwise>
    </xsl:choose>

เทียบเท่ากับโค้ดนี้ ซึ่งสั้นกว่ามาก:

<xsl:if test="not(OU_NAME='OU_ADDR1)'">
              <xsl:value-of select="OU_NAME"/>
        </xsl:if>
            <xsl:if test="OU_ADDR1 !='' ">
                <xsl:value-of select="OU_ADDR1"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="LE_ADDR2 !='' ">
                <xsl:value-of select="OU_ADDR2"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="LE_ADDR3 !='' ">
                <xsl:value-of select="OU_ADDR3"/>
                <fo:block/>
            </xsl:if>
            <xsl:if test="OU_TOWN_CITY !=''">
                <xsl:value-of select="OU_TOWN_CITY"/>,
                <fo:leader leader-pattern="space" leader-length="2.0pt"/>
            </xsl:if>
            <xsl:value-of select="OU_REGION2"/>
            <fo:leader leader-pattern="space" leader-length="3.0pt"/>
            <xsl:value-of select="OU_POSTALCODE"/>
            <fo:block/>
            <xsl:value-of select="OU_COUNTRY"/>

ตอนนี้ สำหรับคำถามของคุณ:

วิธีเปรียบเทียบสององค์ประกอบที่มาจาก xml เป็นสตริง

ใน Xpath 1.0 สามารถเปรียบเทียบสตริงเพื่อความเท่าเทียมกัน (หรือความไม่เท่าเทียมกัน) เท่านั้น โดยใช้ตัวดำเนินการ = และฟังก์ชัน not() ร่วมกับตัวดำเนินการ =

$str1 = $str2

ประเมินค่าเป็น true() อย่างแน่นอนเมื่อสตริง $str1 เท่ากับสตริง $str2

not($str1 = $str2)

ประเมินค่าเป็น true() อย่างแน่นอนเมื่อสตริง $str1 ไม่เท่ากับสตริง $str2

นอกจากนี้ยังมีตัวดำเนินการ != โดยทั่วไปควรหลีกเลี่ยงเนื่องจากมีพฤติกรรมผิดปกติเมื่อใดก็ตามที่ตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นชุดโหนด

ตอนนี้ กฎสำหรับการเปรียบเทียบโหนดองค์ประกอบสองรายการจะคล้ายกัน:

$el1 = $el2

ประเมินเป็น true() อย่างแน่นอนเมื่อค่าสตริงของ $el1 เท่ากับค่าสตริงของ $el2

not($el1 = $el2)

ประเมินเป็น true() อย่างแน่นอนเมื่อค่าสตริงของ $el1 ไม่เท่ากับค่าสตริงของ $el2

อย่างไรก็ตาม หากหนึ่งในตัวถูกดำเนินการของ = เป็นชุดโหนด ดังนั้น

 $ns = $str

ประเมินเป็น true() ทุกประการเมื่อมีอย่างน้อยหนึ่งโหนดในชุดโหนด $ns1 ซึ่งมีค่าสตริงเท่ากับสตริง $str

$ns1 = $ns2

ประเมินเป็น true() อย่างแน่นอนเมื่อมีอย่างน้อยหนึ่งโหนดในชุดโหนด $ns1 ซึ่งค่าสตริงเท่ากับค่าสตริงของบางโหนดจาก $ns2

ดังนั้น สำนวน:

OU_NAME='OU_ADDR1'

ประเมินเป็น true() เฉพาะเมื่อมีองค์ประกอบลูกอย่างน้อยหนึ่งรายการของโหนดปัจจุบันที่ชื่อ OU_NAME และมีค่าสตริงเป็นสตริง 'OU_ADDR1'

เห็นได้ชัดว่านี่ไม่ใช่สิ่งที่คุณต้องการ!

ส่วนใหญ่คุณอาจต้องการ:

OU_NAME=OU_ADDR1

นิพจน์นี้ประเมินเป็น true ว่ามีรายการย่อย OU_NAME อย่างน้อยหนึ่งรายการของโหนดปัจจุบัน และรายการย่อย OU_ADDR1 หนึ่งรายการของโหนดปัจจุบันที่มีค่าสตริงเดียวกัน

สุดท้ายนี้ ใน XPath 2.0 สตริงสามารถเปรียบเทียบได้โดยใช้ตัวดำเนินการเปรียบเทียบค่า lt, le, eq, gt, ge และค่าที่สืบทอดมาจาก XPath 1.0 ตัวดำเนินการเปรียบเทียบทั่วไป =

การพยายามประเมินตัวดำเนินการเปรียบเทียบค่าเมื่ออาร์กิวเมนต์หนึ่งหรือทั้งสองตัวเป็นลำดับของมากกว่าหนึ่งรายการส่งผลให้เกิดข้อผิดพลาด

person Dimitre Novatchev    schedule 13.04.2011