0

忽略标识,下面的 Jython 代码从命令行执行时产生,输出带有自闭合标签(无数据),如下图所示

from java.io import *
import javax.xml
from java.io import StringReader, StringWriter
from javax.xml.transform import Transformer, TransformerFactory
from javax.xml.transform.stream import StreamResult, StreamSource

def obtainservicexslts():

print "In obtainservicexslts"    
print
source_xform_xml = """<?xml version='1.0' encoding='UTF-8'?>
<service-config>
  <service path="/Market">
    <request>         
      <rule transform="local:///services/xslt/MarketRequest.xslt">Transform</rule>
    </request>
    <response>
      <rule transform="local:///services/xslt/MarketResponse.xslt">Transform</rule>          
    </response>        
  </service>
</service-config>"""

source_xform_xslt = """<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="xsltkey" match="/*/*/*/rule[contains(., 'Transform')]/@transform" use="."/>
<xsl:template match="/" mode="xsltname">
    <xsl:variable name="firstoutput">
        <xsl:call-template name="firstpass"/>
    </xsl:variable>
    <xsl:apply-templates select="mutate">            
        <xsl:with-param name="pr" select="exsl:node-set($firstoutput)/*"/>
    </xsl:apply-templates>
</xsl:template>
<xsl:template match="/*" name="firstpass">
    <dpXsltTransforms>
        <xsl:for-each select="/*/*/*/rule[contains(., 'Transform')]/@transform[generate-id()
                                   = generate-id(key('xsltkey',.)[1])]">
            <transform-dpPath>
                <xsl:value-of select="."/>
            </transform-dpPath>
        </xsl:for-each>
    </dpXsltTransforms>
</xsl:template>
<xsl:template match="mutate">
    <xsl:param name="pr"/>
    <services-xslt>            
        <xsl:for-each select="pr/transform-dpPath[contains(., 'local:///services/xslt/')]">
            <xslt-cognomen>
                <xsl:value-of select="substring(.,24)"/>
            </xslt-cognomen>
        </xsl:for-each>
    </services-xslt>
</xsl:template>
</xsl:stylesheet>"""

try:
    transformer = TransformerFactory.newInstance().newTransformer(StreamSource(StringReader(source_xform_xslt)))
    output_buffer = StringWriter()       
    transformer.transform(StreamSource(StringReader(source_xform_xml)), StreamResult(output_buffer))
    print output_buffer.buffer.toString()        
    return output_buffer.buffer.toString()   
except:                
    raise


if __name__ == '__main__':
    obtainservicexslts()

命令行执行

​如果我们从脚本中获取 'xml' 和 'xslt',保存为 2 个单独的文件并在 XMLSPY 中执行转换,观察到以下输出

XMLSPY 执行

XMLSPY 的输出是需要的,我无法使用我的代码复制相同的行为。

还有一点需要注意,我使用'exsl' 作为 xslt 的一部分。不确定,如果这很重要

有没有人遇到过类似的问题,是如何解决的?

请提出一些指示

我愿意在 xslt 或 jython 中调整代码以完成任务

4

0 回答 0