以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  [求助]  第一次处理的xml结果作为第二次处理的输入,2步骤的工作,xslt 能不能一次实现?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=83971)


--  作者:eisbear
--  发布时间:3/23/2010 4:42:00 PM

--  [求助]  第一次处理的xml结果作为第二次处理的输入,2步骤的工作,xslt 能不能一次实现?
最近弄xslt弄得头痛啊,

目前有个1.xml文件要转换,目前我想到的办法是分2次转换,也就是说:

第一次转换: 1.xml + 1.xslt 得出一个2.xml文件
然后第二次: 2.xml +2.xslt 得到3.xml

觉得是笨办法,有没有能一次转换的可能呢,也就是 xslt能不能实现在内存里输出一个临时的xml,而不需要保存第一次结果, 然后在这基础上继续处理?

先谢谢大家的建议。


--  作者:Qr
--  发布时间:3/24/2010 1:35:00 PM

--  
可以用DOM来保存临时的xml对象,但DOM处理XML占用资源比较多,不适合处理大型XML文档。
--  作者:jj_long
--  发布时间:4/30/2010 8:42:00 PM

--  
按照你的思路,答案是肯定的。可以使用一个方法来把两次运行放在一个XSL里边:
注:本Stylesheet使用了XSLT2.0的特性。
XML:
=====================================
<?xml version="1.0" encoding="UTF-8"?>

<mybook>
    <title>XML bible</title>
    <chapter chapnbr="1">
        <title>Introduction</title>
        <para>This is a para</para>
    </chapter>
</mybook>


XSL:
====================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/">
        <xsl:variable name="v_content">
            <xsl:apply-templates/>
        </xsl:variable>
        
        <xsl:apply-templates select="$v_content/*"/>
    </xsl:template>
    
    <!-- 第一次处理 -->    
    <xsl:template match="chapter">
        <xsl:element name="{concat(name(),'_1')}">
            <xsl:apply-templates select="node()|@*"/>        
        </xsl:element>
    </xsl:template>
    
    <!-- 第二次处理 -->    
    <xsl:template match="chapter_1">
        <xsl:element name="{concat(name(),'_2')}">
            <xsl:apply-templates select="node()|@*"/>        
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="*">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="@*">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="."></xsl:value-of>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

输出:
====================================
<?xml version="1.0" encoding="UTF-8"?>
<mybook>
    <title>XML bible</title>
    <chapter_1_2 chapnbr="1">
        <title>Introduction</title>
        <para>This is a para</para>
    </chapter_1_2>
</mybook>


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms