I. XPath giải pháp 2.0 (khuyến cáo nếu bạn có quyền truy cập vào một công cụ XPath 2.0)
(: XPath 2.0 has if ... then ... else ... :)
if(//b[@id=23])
then 'Profit'
else 'Loss'
II. XPath giải pháp 1.0:
Sử dụng:
concat(substring('Profit', 1 div boolean(//b[@id=23])),
substring('Loss', 1 div not(//b[@id=23]))
)
xác nhận sử dụng XSLT 1.0:
chuyển đổi này:
<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="/">
<xsl:value-of select=
"concat(substring('Profit', 1 div boolean(//b[@id=23])),
substring('Loss', 1 div not(//b[@id=23]))
)"/>
</xsl:template>
</xsl:stylesheet>
khi áp dụng trên tài liệu XML cung cấp (điều chỉnh để làm cho nó được hình thành tốt):
<a>
<b id="23"/>
<c></c>
<d></d>
<e>
<f id="23">
<i>123</i>
<j>234</j>
</f>
<f id="24">
<i>345</i>
<j>456</j>
</f>
<f id="25">
<i>678</i>
<j>567</j>
</f>
</e>
</a>
tạo ra truy nã, chính xác kết quả:
Profit
Khi chúng ta thay thế trong văn bản XML:
<b id="23"/>
với:
<b id="24"/>
lại kết quả chính xác được sản xuất:
Loss
Giải thích:
Chúng tôi sử dụng thực tế là:
substring($someString, $N)
là chuỗi rỗng cho tất cả $N > string-length($someString)
.
Ngoài ra, số Infinity
là số duy nhất lớn hơn độ dài chuỗi của bất kỳ chuỗi.
Cuối cùng:
number(true())
là 1
theo định nghĩa,
number(false())
là 0
theo định nghĩa.
Do đó:
1 div $someCondition
là 1
chính xác khi $someCondition
là true()
và là Infinity
chính xác khi nào $someCondition
là false()
Như vậy nó sau từ này rằng nếu chúng ta muốn sản xuất $stringX
khi $Cond
là true()
và để sản xuất $stringY
khi $Cond
là false()
, một cách để thể hiện điều này bằng cách:
concat(substring($stringX, 1 div $cond),
substring($stringY, 1 div not($cond)),
)
Trong biểu thức trên chính xác một trong hai đối số của concat()
chức năng không bị để trống.
Câu hỏi hay, +1. Xem câu trả lời của tôi cho một biểu thức một lớp XPath 1.0 thuần túy. :) –
Cũng được giải thích rộng rãi và giải pháp XPath 2.0 rõ ràng. –