XSLTå¤çå¨çå·¥ä½è¿ç¨å¯ä»¥åä¸ºä¸¤ä¸ªé¶æ®µï¼å
æ ¹æ®æ¨¡æ¿è§åææºXML转æ¢ä¸ºç»ææ ï¼åå°ç»ææ åºåå为åèæµãå¾å¤æ ¼å¼é®é¢é½å¡å¨ç¬¬äºé¶æ®µãæ¯å¦ç»æææ¡£è¦ä¸è¦å¸¦XML声æãå
ç´ ä¹é´æ¯å¦ç¼©è¿ãç¹æ®å符æ¯è½¬ä¹è¿æ¯åæ ·è¾åºï¼è¿äºé½ä¸æ¯é ä¿®æ¹æ¨¡æ¿éçå
ç´ è½è§£å³çï¼èæ¯è¦æ¾å¼é
ç½®åºåååæ°ã<xsl:output>å<xsl:result-document>æ£æ¯å®æè¿é¡¹å·¥ä½çæ ¸å¿å
ç´ ãçè§£å®ä»¬çä½ç¨èå´åä¼å
级ï¼è½é¿å
å¤§éæ è°çè°è¯ã

ä¸ãç¨ xsl:output 设å®ä¸»è¾åºæ ¼å¼
<xsl:output>æ¯XSLT䏿§å¶ä¸»ç»æææ¡£åºååè¡ä¸ºç第ä¸éå¼å
³ãå®å¿
é¡»ä½ä¸º<xsl:stylesheet>æ<xsl:transform>ç顶级åå
ç´ åºç°ï¼å¯ä»¥å¸¦name屿§å½¢æå
·åè¾åºå®ä¹ï¼ä¾åç»ç<xsl:result-document>éè¿format屿§å¼ç¨ã妿䏿å®nameï¼åä½ç¨äºä¸»ç»æææ¡£ãéè¦æç¡®çæ¯ï¼<xsl:output>åªæä¾åºåååæ°ï¼ä¸ä¼æ¹åç»ææ æ¬èº«çç»æï¼å æ¤å³ä½¿è®¾ç½®äºindent="yes"ï¼é£äºå·²ç»ä½ä¸ºææ¬èç¹åå¨ç空ç½ä¹ä¸ä¼è¢«å é¤ã
æ ¸å¿å±æ§å
æ¬methodãencodingãindentãomit-xml-declarationãdoctype-systemãdoctype-publicãcdata-section-elementsãmedia-typeçãmethodå³å®è¾åºç±»åï¼å¸¸è§å弿xmlãhtmlãxhtmlãtext以åèªå®ä¹QNameãencodingæå®åèç¼ç ï¼indentæ§å¶æ¯å¦æ·»å 缩è¿ç©ºç½ï¼omit-xml-declarationæ§å¶æ¯å¦çç¥XML声æãå®ä»¬ä¹é´åå¨èå¨å
³ç³»ï¼ä¾å¦å½method="html"æ¶ï¼æäºXMLç¹æçåºååè§åä¼è¢«æ¾å®½ï¼doctype-systemä¹å¸¸ç¨äºçæHTML5çæ åææ¡£ç±»å声æã
ä¸é¢æ¯ä¸ä¸ªé¢åHTMLè¾åºçå ¸åé ç½®ï¼å®è®©å¤çå¨è¾åºå¸¦ç¼©è¿ã使ç¨UTF-8ç¼ç çHTMLææ¡£ï¼å¹¶èªå¨å ä¸HTML5çDOCTYPE声æã
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes" doctype-system="about:legacy-compat"/>
<xsl:template match="/">
<html>
<head>
<title>示ä¾é¡µé¢</title>
</head>
<body>
<h1>ä½ å¥½ï¼XSLT</h1>
<p>è¿æ¯ä¸ä¸ªç»æææ¡£æ ¼å¼æ§å¶ç¤ºä¾ã</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
éè¦æ³¨æçæ¯ï¼indent="yes"åªä¼å¨å
ç´ èç¹ä¹é´æ·»å 缩è¿ç©ºç½ï¼ä¸ä¼æ¹å¨ææ¬èç¹å
é¨çç©ºæ ¼ææ¢è¡ãå¦ææºææ¡£éå·²ç»å
å«äºç¨äºæççç©ºç½ææ¬èç¹ï¼ç¼©è¿æä½å¯è½ä¼å å 产çå¤ä½ç空ç½ãå æ¤å¨ä½¿ç¨indentä¹åï¼æå¥½å
ç¡®è®¤ç»ææ 䏿¯å¦å卿··åå
容ã对äºçº¯æ°æ®åXML转XMLçåºæ¯ï¼å¼å¯ç¼©è¿é常å¾å®å
¨ï¼ä½å¯¹äºæ£æãè¯æçä¾èµç©ºç½è¯ä¹çå
容ï¼åºå½å
³é缩è¿å¹¶æå·¥æ§å¶ç©ºç½ã
äºãç¨ xsl:result-document æåå¹¶å嫿§å¶æ ¼å¼
XSLT 2.0å¼å
¥<xsl:result-document>åï¼ä¸æ¬¡è½¬æ¢å¯ä»¥çæå¤ä¸ªç»æææ¡£ï¼èä¸åå±éäºåä¸ä¸»è¾åºãå®çhref屿§æå®è¾åºä½ç½®ï¼format屿§æåæä¸ªå
·å<xsl:output>å®ä¹ãè¿ä¸ºå¤é¡µéæç«ç¹çæãæç« èæåææ¡£ãæ¹éçæé
ç½®æä»¶çåºæ¯æä¾äºåçæ¯æãä¸ä¸»è¾åºä¸åï¼<xsl:result-document>å¿
é¡»æ¾å¨æ¨¡æ¿è§åå
é¨ï¼å 为å®çæ§è¡ä¾èµäºå½åèç¹ä¸ä¸æã
å设æºXMLå
å«å¤ä¸ªç« èï¼æ¯ä¸ªç« èéè¦è¾åºä¸ºç¬ç«çHTMLæä»¶ï¼åæ¶ä¸»è¾åºä¿æä¸ä¸ªç®åçXMLç´¢å¼ãå¯ä»¥å¨æ ·å¼è¡¨ä¸å
å®ä¹ä¸ä¸ªå
·åè¾åºæ ¼å¼chapter-htmlï¼ç¶åå¨å¹é
ç« èçæ¨¡æ¿ä¸ä½¿ç¨<xsl:result-document>ã示ä¾å¦ä¸ï¼
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output name="chapter-html" method="html" encoding="utf-8" indent="yes" doctype-system="about:legacy-compat"/>
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<index>
<xsl:for-each select="//chapter">
<entry file="chapter-{position()}.html" title="{@title}"/>
</xsl:for-each>
</index>
</xsl:template>
<xsl:template match="chapter">
<xsl:result-document href="chapter-{position()}.html" format="chapter-html">
<html>
<head>
<title><xsl:value-of select="@title"/></title>
</head>
<body>
<h1><xsl:value-of select="@title"/></h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
è¿éåºç°äºä¸¤ä¸ª<xsl:output>ï¼æ²¡ænameçé£ä¸ªæ§å¶ä¸»è¾åºï¼å¸¦name="chapter-html"çæ§å¶æ¯ä¸ªç« èæä»¶ãè¿ç§å工让åä¸ä»½æºæ°æ®å¯ä»¥åæ¶äº§åºç»æå®å
¨ä¸åçç»æãå®é
ä½¿ç¨æ¶è¦æ³¨æhref屿§æ¯ç¸å¯¹äºä¸»è¾åºåºURIè§£æçï¼ä¸åå¤çå¨å¯¹ç¸å¯¹è·¯å¾ååå
¥æéçå¤çæå·®å¼ã妿è¾åºç®å½ä¸åå¨ï¼é¨åå¤çå¨ä¼æ¥éï¼èå¦ä¸äºå¯è½ä¼éé»å¤±è´¥ï¼å æ¤å»ºè®®å¨æ ·å¼è¡¨æ§è¡å确认ç®å½ç»æã
对äºä»å¨ä½¿ç¨XSLT 1.0çèå¤çå¨ï¼å¦Xalanæ§çæ¬ï¼ï¼<xsl:result-document>ä¸å¯ç¨ãæ¤æ¶é常éè¦åå©å¤ç卿©å±ï¼æ¯å¦Xalançredirectæ©å±ï¼æè
ææåé»è¾æ¾å°å¤é¨èæ¬ä¸ãå¦æé¡¹ç®ææ¡ä»¶åçº§å°æ¯æXSLT 3.0çSaxonæxsltprocï¼åå¯ä»¥ç´æ¥äº«åå¤ææ¡£è¾åºç便å©ã
ä¸ãå符æ å°ä¸ç¦ç¨è¾åºè½¬ä¹
åºååé¶æ®µé¤äºå³å®æ´ä½çmethodåencodingï¼è¿å¯ä»¥å¯¹å
·ä½å符è¿è¡æ¹åãXSLT 2.0æä¾ç<xsl:character-map>å
许å®ä¹ä¸ä¸ªåç¬¦æ¿æ¢è¡¨ï¼æç»ææ 䏿æ¬èç¹éçæäºå符å¨è¾åºæ¶æ¿æ¢ä¸ºå
¶ä»å符串ãå
¸ååºç¨å
æ¬æå¶è¡¨ç¬¦æ¿æ¢ä¸ºåºå®æ°éçç©ºæ ¼ãæç¹æ®Unicodeå符æ å°ä¸ºå½åå®ä½ãæè
å¨çº¯ææ¬è¾åºä¸æå
¥æ¢è¡ç¬¦ãå符æ å°åªå½±ååºååè¾åºï¼ä¸ä¼æ¹åç»ææ ä¸çææ¬èç¹å
容ï¼å æ¤å¯¹åç»å¤çæ¯æ æçã
ä¸é¢å®ä¹ä¸ä¸ªå符æ å°ï¼æå¶è¡¨ç¬¦ï¼	ï¼æ¿æ¢ä¸ºåä¸ªç©ºæ ¼ï¼æä¸é´æç©ºæ ¼ï¼ ï¼æ¿æ¢ä¸º å®ä½ï¼å¹¶å¨<xsl:output>ä¸éè¿use-character-maps屿§å¯ç¨å®ã
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:character-map name="text-cleanup">
<xsl:output-character character=" " string=" "/>
<xsl:output-character character=" " string=" "/>
</xsl:character-map>
<xsl:output method="html" encoding="utf-8" use-character-maps="text-cleanup"/>
<xsl:template match="/">
<html>
<body>
<p>è¿éæä¸ä¸ªå¶è¡¨ç¬¦ï¼ å䏿®µä¸é´æç©ºæ ¼ï¼ </p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
å符æ å°è®©ç¹æ®å符çå¤çåå¾å¯é¢æµï¼ä¹é¿å
äºå¨æ¨¡æ¿ä¸å°å¤è°ç¨åç¬¦ä¸²æ¿æ¢å½æ°ãä¸è¿è¦æ³¨æï¼æ å°åçå¨åºååé¶æ®µï¼å¤çå¨å¿
é¡»æ¯æè¿ä¸ç¹æ§ãå¦æä½¿ç¨ä¸æ¯æ<xsl:character-map>çæ§å¤çå¨ï¼æ ·å¼è¡¨ä¼ç´æ¥æ¥éã
å¦ä¸ä¸ªå岿´ä¹
çæ§å¶ææ®µæ¯disable-output-escapingãå®å¯ä»¥éå å¨<xsl:value-of>æ<xsl:text>ä¸ï¼è®©ææ¬èç¹ä¸çç¹æ®å符ï¼å¦<å&ï¼åæ ·è¾åºèä¸è¿è¡è½¬ä¹ãä¾å¦å¨HTMLä¸åµå
¥ä¸æ®µèæ¬æ¶ï¼ææ¶ä¼çå°è¿æ ·çåæ³ï¼<xsl:value-of select="script-content" disable-output-escaping="yes"/>ãè½ç¶å®ç¡®å®è½è§£å³é®é¢ï¼ä½ç ´åäºXSLTçæ½è±¡æ¨¡åï¼å¤çå¨ä¹å¯è½å¨å
é¨å®ç°æ¶å¿½ç¥è¯¥å±æ§ï¼å¯¼è´ç»æä¸å¯ç§»æ¤ãæ´ç¨³å¦¥çåæ³æ¯æèæ¬å
容ä½ä¸ºææ¬èç¹ç´æ¥æ¾å¨å
ç´ å
é¨ï¼æè
éè¿å符æ å°æ¥çæéè¦çå符ã
åãå¸¸è§æ ¼å¼æ§å¶é®é¢ä¸è°è¯å»ºè®®
ç¼ç ä¸ä¸è´æ¯åå¦è
æå®¹æè¸©çåãæºXMLå¯è½å£°æä¸ºISO-8859-1ï¼è<xsl:output encoding="UTF-8">è¦æ±è¾åºUTF-8ãå¤çå¨å¨è§£ææºææ¡£æ¶ä¼æ ¹æ®å£°æè¿è¡è§£ç ï¼åæè¾åºç¼ç éæ°ç¼ç ãå¦ææºææ¡£çå®é
åèå声æä¸å¹é
ï¼ä¹±ç å°±ä¸å¯é¿å
ãå æ¤ææ¥æ ¼å¼é®é¢æ¶ï¼å
æ£æ¥æºXMLçencodingå£°ææ¯å¦ä¸å®é
æä»¶åèä¸è´ï¼åç¡®å®è¾åºç¼ç æ¯å¦æ»¡è¶³ç®æ ç³»ç»çè¦æ±ã
缩è¿ä¸ç©ºç½é®é¢ä¹ç»å¸¸åºç°ãindent="yes"æ·»å ç空ç½åªåå¨äºå
ç´ ä¹é´ï¼ä¸ä¼ä¿®æ¹å
ç´ å
çææ¬ãå¦æç»ææ æ¬èº«å°±æ¯æ··åå
å®¹ï¼æ¯å¦æ®µè½éæ¢æææ¬åæè¡å
æ ç¾ï¼èªå¨ç¼©è¿å¯è½ç ´åå
容çèªç¶æçãè¿ç§æ
åµä¸åºå½å
³éindentï¼å¹¶å¨æ¨¡æ¿ä¸æ¾å¼è¾åºæ¢è¡åç©ºæ ¼ãå¦ä¸ä¸ªæå·§æ¯ä½¿ç¨<xsl:strip-space>ç§»é¤æºææ¡£ä¸æ æä¹çç©ºç½ææ¬èç¹ï¼ä»¥ä¾¿è®©èªå¨ç¼©è¿çæææ´å¹²åã
DOCTYPE声æåCDATAåºæ®µæ¯æ ¼å¼æ§å¶ä¸ç两个å®ç¨ç»èã使ç¨doctype-system="about:legacy-compat"å¯ä»¥ä¸ºHTML5è¾åºçææ åææ¡£ç±»å声æï¼é¿å
æµè§å¨è¿å
¥æªå¼æ¨¡å¼ãcdata-section-elements屿§å¯ä»¥æå®åªäºå
ç´ çå
容ç¨CDATAåºæ®µå
裹ï¼éåå¨XMLä¸åµå
¥ä»£ç çæ®µãéè¦æ³¨æçæ¯ï¼å¦æç®æ æ ¼å¼æ¯HTMLï¼CDATAåºæ®µé常ä¼è¢«å¿½ç¥ï¼å 为HTMLè§£æå¨ä¸è¯å«CDATAæ è®°ã
è°è¯åºååé®é¢æ¶ï¼å½ä»¤è¡å·¥å
·çæçè¿é«äºåå¤ä¿®æ¹æ ·å¼è¡¨åå·æ°é¡µé¢ãSaxonç-oé项å¯ä»¥ç´æ¥æè¾åºåå
¥æä»¶ï¼xsltprocä¹è½éè¿éå®åæ¥çç»æã妿æçæ¯å¤çå¨çæ¬å·®å¼å¯¼è´æ ¼å¼ä¸åï¼å¯ä»¥åå«ç¨Saxonåxsltprocè¿è¡åä¸ä»½æ ·å¼è¡¨ï¼å¯¹æ¯è¾åºå·®å¼ãå¾å¤æ¶åï¼é®é¢å¹¶éåºå¨XSLTä»£ç æ¬èº«ï¼èæ¯å¤çå¨çé»è®¤åºåååæ°ä¸åã

