2014-04-18 14 views
5

Tôi có một tệp XML lưu trữ dữ liệu. Tôi đang sử dụng một XSL để tạo các tệp HTML từ tệp XML đó. Khi tôi cố gắng làm điều đó, tôi gặp lỗi Illegal HTML character: decimal 150Cách xử lý các ký tự HTML bất hợp pháp trong XSL

Tôi không được phép thay đổi tệp XML. Tôi phải lập bản đồ một và nhiều nhân vật bất hợp pháp khác với một nhân vật hợp pháp (nó có thể là bất kỳ) trong XSL. Vì vậy, nó phải làm điều đó một cách chung chung không chỉ cho một loại nhân vật.

Trả lời

7

Bạn có thể định nghĩa một đồ vật mà các bản đồ các nhân vật không được phép một phép, ví dụ một không gian:

<xsl:output indent="yes" method="html" use-character-maps="m1"/> 

<xsl:character-map name="m1"> 
    <xsl:output-character character="&#150;" string=" "/> 
</xsl:character-map> 

Là một thay thế, sử dụng một mẫu thay thế tất cả các nhân vật bất hợp pháp, theo http://www.w3.org/TR/xslt-xquery-serialization/#HTML_CHARDATA đây là những kiểm soát ký tự # x7F- # x9F để sử dụng

<xsl:template match="text()"> 
    <xsl:value-of select="replace(., '[&#x007F;-&#x009F;]', ' ')"/> 
</xsl:template> 

phải đảm bảo các ký tự đó trong các nút văn bản trong tài liệu đầu vào được thay thế bằng dấu cách.

Là một giải pháp thay thế khác, bạn có thể xem xét xuất XHTML với các phần tử trong không gian tên XHTML và phương thức xuất xhtml.

Dựa trên danh sách các nhân vật, bản đồ nhân vật đầy đủ lập bản đồ tất cả các ký tự điều khiển bất hợp pháp đến một không gian là

<xsl:character-map 
        name="no-control-characters"> 
    <xsl:output-character character="&#127;" string=" "/> 
    <xsl:output-character character="&#128;" string=" "/> 
    <xsl:output-character character="&#129;" string=" "/> 
    <xsl:output-character character="&#130;" string=" "/> 
    <xsl:output-character character="&#131;" string=" "/> 
    <xsl:output-character character="&#132;" string=" "/> 
    <xsl:output-character character="&#133;" string=" "/> 
    <xsl:output-character character="&#134;" string=" "/> 
    <xsl:output-character character="&#135;" string=" "/> 
    <xsl:output-character character="&#136;" string=" "/> 
    <xsl:output-character character="&#137;" string=" "/> 
    <xsl:output-character character="&#138;" string=" "/> 
    <xsl:output-character character="&#139;" string=" "/> 
    <xsl:output-character character="&#140;" string=" "/> 
    <xsl:output-character character="&#141;" string=" "/> 
    <xsl:output-character character="&#142;" string=" "/> 
    <xsl:output-character character="&#143;" string=" "/> 
    <xsl:output-character character="&#144;" string=" "/> 
    <xsl:output-character character="&#145;" string=" "/> 
    <xsl:output-character character="&#146;" string=" "/> 
    <xsl:output-character character="&#147;" string=" "/> 
    <xsl:output-character character="&#148;" string=" "/> 
    <xsl:output-character character="&#149;" string=" "/> 
    <xsl:output-character character="&#150;" string=" "/> 
    <xsl:output-character character="&#151;" string=" "/> 
    <xsl:output-character character="&#152;" string=" "/> 
    <xsl:output-character character="&#153;" string=" "/> 
    <xsl:output-character character="&#154;" string=" "/> 
    <xsl:output-character character="&#155;" string=" "/> 
    <xsl:output-character character="&#156;" string=" "/> 
    <xsl:output-character character="&#157;" string=" "/> 
    <xsl:output-character character="&#158;" string=" "/> 
    <xsl:output-character character="&#159;" string=" "/> 
</xsl:character-map> 

tôi tạo ra danh sách đó với XSLT 2.0 và Saxon, sử dụng

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias" 
    exclude-result-prefixes="xs axsl"> 

<xsl:param name="start" as="xs:integer" select="127"/> 
<xsl:param name="end" as="xs:integer" select="159"/> 

<xsl:param name="replacement" as="xs:string" select="' '"/> 

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> 

<xsl:output method="xml" indent="yes" use-character-maps="character-reference"/> 

<xsl:character-map name="character-reference"> 
    <xsl:output-character character="«" string="&amp;"/> 
</xsl:character-map> 

<xsl:template name="main"> 
    <axsl:character-map name="no-control-characters"> 
    <xsl:for-each select="$start to $end"> 
     <axsl:output-character character="«#{.};" string="{$replacement}"/> 
    </xsl:for-each> 
    </axsl:character-map> 
</xsl:template> 

</xsl:stylesheet> 
+0

Cảm ơn, nó giải quyết vấn đề cho thập phân 150. Nhưng làm thế nào tôi có thể bản đồ nhiều hơn 1 loại? Có cách nào chung không? – US1925

+0

Bạn có thể đặt nhiều phần tử 'xsl: output-character' vào' xsl: character-map' khi cần. –

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