Sử dụng đệ quy, chúng ta có thể đi bộ qua một chuỗi trong XSLT để đánh giá tất cả các nhân vật. Để thực hiện việc này, hãy tạo mẫu mới chỉ chấp nhận một tham số chuỗi. Kiểm tra ký tự đầu tiên và nếu đó là ký tự viết hoa, hãy viết dấu cách. Sau đó viết nhân vật. Sau đó, gọi lại mẫu với các ký tự còn lại bên trong một chuỗi. Điều này sẽ dẫn đến những gì bạn muốn làm.
Đó sẽ là con trỏ của bạn. Tôi sẽ cần một chút thời gian để tìm ra mẫu. :-)
Phải mất một số thử nghiệm, đặc biệt là để có được không gian bên trong toàn bộ điều. (Tôi bị lạm dụng một nhân vật cho điều này!) Tuy nhiên, mã này sẽ cung cấp cho bạn một ý tưởng ...
tôi đã sử dụng XML này:
<?xml version="1.0" encoding="UTF-8"?>
<blah>UserLicenseCode</blah>
và sau đó kiểu này:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text"/>
<xsl:variable name="Space">*</xsl:variable>
<xsl:template match="blah">
<xsl:variable name="Split">
<xsl:call-template name="Split">
<xsl:with-param name="Value" select="."/>
<xsl:with-param name="First" select="true()"/>
</xsl:call-template></xsl:variable>
<xsl:value-of select="translate($Split, '*', ' ')" />
</xsl:template>
<xsl:template name="Split">
<xsl:param name="Value"/>
<xsl:param name="First" select="false()"/>
<xsl:if test="$Value!=''">
<xsl:variable name="FirstChar" select="substring($Value, 1, 1)"/>
<xsl:variable name="Rest" select="substring-after($Value, $FirstChar)"/>
<xsl:if test="not($First)">
<xsl:if test="translate($FirstChar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '..........................')= '.'">
<xsl:value-of select="$Space"/>
</xsl:if>
</xsl:if>
<xsl:value-of select="$FirstChar"/>
<xsl:call-template name="Split">
<xsl:with-param name="Value" select="$Rest"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
và tôi nhận được kết quả là:
User License Code
Hãy nhớ rằng không gian và các ký tự trắng khác có xu hướng bị tước đi om XML, đó là lý do tại sao tôi sử dụng một '*' thay vào đó, mà tôi dịch sang một không gian.
Tất nhiên, mã này có thể được cải thiện. Đó là những gì tôi có thể đưa ra trong 10 phút làm việc. Trong các ngôn ngữ khác, nó sẽ có ít dòng mã hơn nhưng trong XSLT nó vẫn còn khá nhanh, xem xét số lượng các dòng mã mà nó chứa.
Nguồn
2009-09-13 21:34:47
+1, vì XSLT vẫn là một bí ẩn đối với tôi, vì vậy trong khi tôi không thể * trợ giúp *, tôi chắc chắn đang xem những phát triển ở đây. –
+1 cho suy nghĩ phức tạp trong khi thực tế, nó chỉ là rất nhiều mã. :-) Không có gì là phức tạp khi bạn biết làm thế nào. –