2012-01-12 45 views
8

Chương trình Java này sử dụng một Ternary nếu, để ánh xạ các booleans tới các chuỗi đầu ra: (a "*" cho đúng, một chuỗi rỗng cho sai).Thành ngữ XSLT 1.0 cho ternary nếu?

public class ternary { 
    public static void main(String[] args) { 
    boolean flags[]={true,false,true}; 
    for (boolean f : flags) { 
     System.out.println(f?"*":""); 
    } 
    } 
} 

Vì vậy, đầu ra là *, [empty], *.

Tôi có một tài liệu đầu vào XML, một cái gì đó như:

<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="change.xsl"?> 
<root> 
    <change flag="true"/> 
    <change flag="false"/> 
    <change flag="true"/> 
</root> 

Và tôi có mẫu XSLT sau đó bản đồ đúng với '*' và sai để '' (nó hoạt động):

<xsl:template match="change"> 
    <xsl:variable name="flag" select="translate(substring(@flag,1,1),'tf','*')"/> 
    <xsl:value-of select="$flag"/> 
</xsl:template> 

Có phiên bản ngắn gọn hơn về điều này không?

a) Tôi có thể tự động nhận giá trị boolean true | false trực tiếp từ chuỗi 'true | false' không? b) Có cấu trúc (xpath?) Để ánh xạ boolean true | false tới '*', '' không?

+0

Câu hỏi tương tự: http://stackoverflow.com/questions/971067/is-there-an-if-then-else-statement-in-xpath – Vadzim

Trả lời

8

a) Tôi có thể tự động nhận giá trị boolean true | false trực tiếp từ chuỗi 'true | false' không?

b) Có cấu trúc (xpath?) Để ánh xạ boolean true | false đến '*', ''?

Đây thực sự là câu hỏi XPath.

I. XPath 1.0

Có nhiều hơn một biểu thức XPath đánh giá trong đó tạo ra kết quả mong muốn:

substring('*', 2 -(@flag = 'true')) 

này cũng trả lời b) - nhận thấy rằng các chuỗi'true''false' không phải là giá trị boolean! Hai giá trị boolean duy nhất là true()false() và chúng không phải là chuỗi.

Trong biểu thức trên, chúng tôi sử dụng thực tế là trong XPath 1.0 nếu boolean nằm trong ngữ cảnh cần số, nó sẽ tự động được chuyển thành số.Theo định nghĩa:

number(true())1

number(false())0

Như vậy đối số thứ hai của cuộc gọi để substring() trên:

2 - (@flag = 'true') 

được đánh giá là 1 khi @flag = 'true' và đến 2 nếu không.

Một XPath tổng quát hơn 1,0 biểu hiện sản xuất chuỗi $s1 nếu $val"x" và tạo ra chuỗi $s2 nếu $val"y":

concat(substring($s1, 1 div ($val = "x")), 
     substring($s2, 1 div ($val = "y")) 
    ) 

này tạo ra chuỗi $s1 khi $val = "x", chuỗi $s2 khi $val = "y" và chuỗi trống - nếu không có điều kiện nào trong số hai điều kiện này nắm giữ.

Trên đây XPath 1.0 biểu thức có thể được khái quát hóa để sản xuất N khác nhau dẫn đến chuỗi $s1, $2 ..., $sN chính xác khi nào $val là một trong những giá trị $v1, $v2 ..., $vN vì chức năng concat() có thể có bất kỳ số lượng đối số nào.


II. XPath 2.0 (XSLT 2,0)

'*'[current()/@flag = 'true'] 

Và tổng quát hơn, được đưa ra 2 * N giá trị nguyên tử $s1, $s2 ... $sN$v1, $v2 ..., $vN, chẳng hạn rằng tất cả $vi giá trị khác nhau , kết quả của việc đánh giá 2.0 biểu thức XPath này:

($s1, $s2, ..., $sN)[index-of(($v1, $v2, ..., $vN), $v)] 

$sK chính xác khi nào $v eq $vK.

+0

Rất cám ơn vì lý do này - tại sao '2-x' chứ không phải ' 1-x 'mặc dù? – monojohnny

+0

@monojohnny: Câu hỏi hay. Lý do cho '2-x' là để có được 1 hoặc 2. Lập chỉ mục XPath là dựa trên 1, không dựa trên 0. –

+0

ah có, tôi quên các chuỗi XSL là 1 ràng buộc! Chúc mừng! có ý nghĩa. – monojohnny

1

Bạn có thể sử dụng đối sánh mẫu đơn giản trong các mẫu cho việc này.

<xsl:template match="change[@flag = 'true']"> 

<xsl:template match="change"> 

Vì vậy, một trong những đầu tiên phù hợp với đúng mục, và một trong những khác phù hợp với tất cả các trường hợp khác (mà trong trường hợp của bạn chỉ là sai

Vì vậy, do stylesheet sau

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

    <xsl:template match="change[@flag = 'true']"> 
     <xsl:text>*&#13;</xsl:text> 
    </xsl:template> 

    <xsl:template match="change"> 
     <xsl:text>&#13;</xsl:text> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 
</xsl:stylesheet> 

Khi áp dụng cho XML mẫu của bạn, sau đây là đầu ra

* 

* 
Các vấn đề liên quan