Dưới đây là một giải pháp hiệu quả hơn O (N) vs O (N^2) cho câu trả lời chấp nhận:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="text()" name="skipAfterDots">
<xsl:param name="pTotalString" select="."/>
<xsl:param name="pTotalLength" select="string-length(.)"/>
<xsl:param name="pPosition" select="1"/>
<xsl:param name="pLastFound" select="-1"/>
<xsl:choose>
<xsl:when test="$pPosition > $pTotalLength">
<xsl:value-of select="substring($pTotalString, $pLastFound + 1)"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vIsDot" select=
"substring($pTotalString, $pPosition, 1) = '.'"/>
<xsl:call-template name="skipAfterDots">
<xsl:with-param name="pTotalString" select="$pTotalString"/>
<xsl:with-param name="pTotalLength" select="$pTotalLength"/>
<xsl:with-param name="pLastFound" select=
"$pLastFound * not($vIsDot) + $pPosition * $vIsDot"/>
<xsl:with-param name="pPosition" select="$pPosition+1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Khi chuyển đổi này được áp dụng trên các tài liệu XML sau:
0.123.
<t>M:Namespace.Class.Method(Something a, Something b)</t>
sự muốn, kết quả chính xác được sản xuất:
Method(Something a, Something b)
Giải thích:
Giải pháp này không chứa bất kỳ cuộc gọi đến substring-after()
chức năng. Thay vào đó, ở mỗi bước chỉ có một ký tự của chuỗi được so sánh cho sự bình đẳng với ký tự dấu chấm. Bởi vì có tối đa N ký tự, đây là O (N) - phức tạp tuyến tính.
Ngược lại, câu trả lời được chấp nhận gọi hàm substring-after()
trên mọi bước. Trong trường hợp xấu nhất có thể có N dấu chấm và do đó điều này sẽ là O (N^N) - bậc hai phức tạp.
Lưu ý: Chúng tôi đưa ra giả định hợp lý rằng trong cả hai giải pháp xác định ký tự thứ k của một chuỗi là O (1).
Nguồn
2012-01-31 13:32:38
Ngắt của http://stackoverflow.com/questions/14527/xslt-reverse-find-in-a-string? –