[经验总结]XSLT开发总结

2024-03-30 23:38

本文主要是介绍[经验总结]XSLT开发总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    注意XSLT不能对输入文档的DOM树进行更改
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
    1 循环 for-each
    xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text" indent="no"/>
    
        <xsl:template match="a">
            <xsl:for-each select="./node()">
                <xsl:choose>
                    <!--Text node -->
                    <xsl:when test="./self::text()">StartATag<xsl:copy select="."/>EndATag</xsl:when>
    
                    <!--Element node-->
                    <xsl:when test="./self::*">StartBTag<xsl:copy-of select="./node()"/>EndBTag</xsl:when>
                </xsl:choose>
            </xsl:for-each>
        </xsl:template>
    
    </xsl:stylesheet>

==================================================================

    2 div 定义元素与属性
                  
    <xsl:element name="div">
                                                   <xsl:attribute name="type"><xsl:text>maintitle</xsl:text></xsl:attribute>
                                                   <xsl:attribute name="name"><xsl:value-of select="./PAM_Attributes/PAM_Attr[@name='tqID']/@value"/></xsl:attribute>
                                                   <xsl:attribute name="class"><xsl:text>maintitle</xsl:text></xsl:attribute>
                        <xsl:copy-of select="./PAM_Attributes/following-sibling::*"/>
                                         </xsl:element>
 
==================================================================

    3 在XSLT中操作多个XML文件
    <xsl:variable name="docs1" select="document('./file1.XML')"/>
    <xsl:copy-of select="$docs1"/>
    
    <xsl:variable name="docs2" select="document('./file2.XML')"/>
    <xsl:copy-of select="$docs2"/>
 
==================================================================

    4 无穷递归 错误提示
    The XSL processor stack has overflowed - probable cause is
    infinite template recursion.

==================================================================

    5 变量算术操作示例
    <xsl:value-of select="$nsLength*10"/>
 
==================================================================

    6 xslt模板 参数 param  
    <?xml version="1.0" encoding="UTF-8" ?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:param name="Key1"/>
      <xsl:param name="Path"/>
 
==================================================================
    7  Makefile for xsltproc
    # For XSLT
    PARSE = xsltproc
    SRC = main1.xml
    STYLESHEET = ../../xsl/makepaper.xsl
    OUTPUT = ../../output.html
    
    
    all :  $(SRC) $(STYLE)
             $(PARSE)  $(STYLESHEET) $(SRC) > $(OUTPUT)  
    
    clean:
             del $(OUTPUT)
 
==================================================================

    8 libxslt库辅助工具xlstproc 用法示例
    带参数的xslt para xslt
    WURFL XSLT Tools
    by Roland Guelle
    
    The WURFL information is stored in XML. So the simpliest way to manipulate and transformm WURLF is XSLT.
    If you have ideas or own XSLT, your help is welcome :)
    
    These stylesheets are tested with xsltproc from the package libxslt. I only use this on the command line, if you need a GUI - there are lot of tools that helps you working with XSLT.
    Some exslt extensions are used, so please check if your XSLT processor supports this.
    
    If you have never worked with a XSLT processor or the command line before, add to WURFL and open the file with Firefox.
    
    Available XSLTs
    
    patch_wurfl.xsl
    Patch WURFL with your own devices, groups and capabilities.
    Example:
    run: xsltproc --stringparam 'file' "your_patch_file" patch_wurfl.xsl wurfl.xml > wurfl_patched.xml
    If you like to format the output (with xmllint):
    run: xsltproc --stringparam 'file' "your_patch_file" patch_wurfl.xsl wurfl.xml | xmllint --format - > wurfl_patched.xml
    If you like to format the output (with tidy):
    run: xsltproc --stringparam 'file' "your_patch_file" patch_wurfl.xsl wurfl.xml | tidy -config tidy_config - > wurfl_patched.xml
    
    check_wurfl.xsl
    Checks your patched/modified WURFL consistency if:
    id attribute is present and unique
    user_agent attribute is present and unique
    fall_back is available and could be resolved
    
    Example:
    run: xsltproc check_wurfl.xsl wurfl.xml
    
    roll out XSLT
    Resolve WURFL fallbacks for all values and capabilities defined in roll_out_capabilities.xml.
    Check the parameters in the XSLT for more options.
    roll_out_into_txt.xsl
    Create text (maybe CSV compatible) version of WURFL.
    Example:
    run: xsltproc roll_out_into_txt.xsl wurfl.xml > wurfl.txt
    roll_out_into_xml.xsl
    Create a flat WURFL version, with each capability as device attribute SQL.
    Example:
    run: xsltproc roll_out_into_xml.xsl wurfl.xml > flat_wurfl.xml
    roll_out_into_sql.xsl
    Create SQL statements for insert WURFL into a SQL database.
    If you like, you can also generate the create statement with this script (default).
    Example:
    run: xsltproc roll_out_into_sql.xsl wurfl.xml > wurfl.sql
    
    remove_elements.xsl
    WURFL lists many capabilities and groups. If you don't need each of these elements, you will find this tool really useful.
    Create a small XML listing the unwanted groups, run the XSLT and you'll get a new WURFL without the groups and the capabilities that you have selected. This should help you keep WURFL smaller and make your applications faster.
    Example:
    edit remove_elements.xml
 
          <?xml version="1.0" encoding="UTF-8"?>
          <elements>
          <groups>
            <group>wta</group>
            <group>object_download</group>
            <group>streaming</group>
            <group>wap_push</group>
            <group>j2me</group>
            <group>mms</group>
            <group>sms</group>
            <group>sound_format</group>
          </groups>
          <capabilities>
            <capability>tiff</capability>
          </capabilities>
          </elements>
      
 
    run: xsltproc --stringparam 'file' "remove_elements.xml" remove_elements.xsl wurfl.xml > clean_wurfl.xml
    
    Some (maybe) outdated stylesheets:
    get_capabilities.xsl
    Get capabilities without groups from WURFL for selected user agent.
    Example:
    run: xsltproc --stringparam 'ua' "Nokia3650" get_capabilities.xsl wurfl.xml
    
    convert_wurfl_markups.xsl
    Convert the WURLF markups to the 'old' names.
    The markup names have changed from wml11 to wml_1_1 standard.
    If you don't want to change your application, you can use this XSLT to transform the names into the old format.
    Example:
    run: xsltproc convert_wurfl_markups.xsl wurfl.xml > wurfl_converted.xml
    
    count_useragents.xsl
    Answers your question "how many useragents/capabilities are stored in WURFL?"
    Example:
    run: xsltproc count_useragents.xsl wurfl.xml
    
    convert_2_html.xsl
    Create an HTML page from the WURFL.xml
    Example:
    run: xsltproc convert_2_html.xsl wurfl.xml > wurfl.html
 
==================================================================

    9 XSLT 2.0 使用 XPath 2.0 和 XSLT 2.0 节省开发时间并减少代码量
 
    http://www.ibm.com/developerworks/cn/xml/x-xslt20xpath20/
 
==================================================================
10 XSLT中模拟 map与 固定次数的循环
    <!--将数字转换成字母 以用作选项-->
    <xsl:template name='digital2letter'>
      <xsl:param name='digit' select='0'/>
      <xsl:choose>
        <xsl:when test='$digit = 0'>A</xsl:when>
        <xsl:when test='$digit = 1'>B</xsl:when>
        <xsl:when test='$digit = 2'>C</xsl:when>
        <xsl:when test='$digit = 3'>D</xsl:when>
        <xsl:when test='$digit = 4'>E</xsl:when>
        <xsl:when test='$digit = 5'>F</xsl:when>
        <xsl:when test='$digit = 6'>G</xsl:when>
 
        <xsl:otherwise><p>Error Choice</p></xsl:otherwise>
      </xsl:choose>
    </xsl:template>
 
 
         <xsl:template name="AddGeneralChoises"> 
                   <xsl:param name="QuestionID"/>        
                   <xsl:param name="level" select="0" /> <!--递归深度-->
 
 
        <xsl:if test="$level &lt; 6"> <!--固定添加六个选项-->
            <xsl:variable name="choiceLetter">
                <xsl:call-template name="digital2letter"> 
                    <xsl:with-param name="digit" select="$level"/>
                </xsl:call-template>
            </xsl:variable>
 
            <xsl:element name="input">
                <xsl:attribute name="type">radio</xsl:attribute>
                <xsl:attribute name="name"><xsl:value-of select="$QuestionID"/></xsl:attribute>
                <xsl:attribute name="choice"> <xsl:value-of select="."/> </xsl:attribute>
                <xsl:attribute name="onfocus"><xsl:text>blur()</xsl:text></xsl:attribute>
            </xsl:element>
 
            <xsl:value-of select="$choiceLetter"/>
            <xsl:text>  </xsl:text>
 
            <xsl:variable name="levelPlus" select="$level + 1" />
 
            <xsl:call-template name="AddGeneralChoises"> <!--XSLT 1.0不支持固定循环次数的for-each,只能用递归模拟循环-->
                <xsl:with-param name="QuestionID" select="$QuestionID"/>
                <xsl:with-param name="level" select="$levelPlus"/>
            </xsl:call-template>
 
        </xsl:if>
 
    </xsl:template>

==================================================================

    15 xslt  输出方法  outmethod 很重要
      标准文档: http://www.w3.org/TR/xslt#section-XML-Output-Method
      同样一个<b/>  html输出成<b></b>  xml输出成<b/>

==================================================================

    16  xslt output method引起的网页显示问题。
 
      环境:Windows XP SP3 + IE 8.0
    
     xslt:      
      makepaper.xsl:  <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="yes"/>
    
      mainbody.html:  <html>
    
      问题:  <br />输成<br/>  IE8对<br/>当成<br>解析,导致<br/>后面的文字都变成黑体。
    
      将<xsl:output method="xml" />改为<xs:output method="html" />
      出现新问题,图片不显示,图片链接中的汉字为乱码:
        file:///E:/%25E5%25B1%25B1%25E8%25A5%25BF%25E5%2585%2589%25E7%259B%2598/web/data/demo/image/image2.jpeg
    
      file:///E:/光盘/web/data/demo/image/image2.jpeg
    
      最终解决办法:
        更改mainbody.html: 为xhtml格式
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    
      xsl的输出格式为xml,xhtml中能正确解析 <br/>而不是将之当成<br>处理。

==================================================================

    17 处理文本结果的技巧
         <xsl:template match="text()">
            <xsl:variable name="parentName" select="name(..)" />
 
            <xsl:if test='$parentName != "OOXML"'> <!--过滤OOXML的信息-->
                <xsl:copy-of select="."/>
            </xsl:if>
         </xsl:template>
==================================================================

    18  XSLT 判断XML结点的类型 XSLT

    <?xml version="1.0"?>
    <!--以下代码摘自XSLTSL工程-->
    <!--在XSLT中判断XML文档的结点类型 -->
    
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
        xmlns:node="http://xsltsl.org/node"
        extension-element-prefixes="doc node">
    
      <xsl:template name="node:type">
        <xsl:param name="node" select="."/>
    
        <xsl:choose>
          <xsl:when test="not($node)"/>
          <!--运用了self轴-->
          
          <xsl:when test="$node[1]/self::*">                     <!--元素结点-->
               <xsl:text>element</xsl:text>
          </xsl:when>
    
          <xsl:when test="$node[1]/self::text()">                <!--文本结点-->
               <xsl:text>text</xsl:text>
          </xsl:when>
    
          <xsl:when test="$node[1]/self::comment()">             <!--注释结点-->
               <xsl:text>comment</xsl:text>
          </xsl:when>
    
          <xsl:when test="$node[1]/self::processing-instruction()">  <!--处理指令结点-->
        <xsl:text>processing instruction</xsl:text>
          </xsl:when>
          <xsl:when test="not($node[1]/parent::*)">                  <!--根结点-->
            <xsl:text>root</xsl:text>
          </xsl:when>
    
          <!--下面两种类型的判断巧妙运用了集合的概念-->
          <xsl:when test="count($node[1] | $node[1]/../namespace::*) = count($node[1]/../namespace::*)">
            <xsl:text>namespace</xsl:text>
          </xsl:when>
    
          <xsl:when test="count($node[1] | $node[1]/../@*) = count($node[1]/../@*)">
            <xsl:text>attribute</xsl:text>
          </xsl:when>
    
        </xsl:choose>
      </xsl:template>
    
    </xsl:stylesheet>

==================================================================

    9 在XSLT载入XML文档,注意XML文件不存在时,为避免在网页报错,需将文件名置空。
    <xsl:variable name="propertyDoc" select="document($propertyFile)"/>

这篇关于[经验总结]XSLT开发总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862882

相关文章

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解