【问题标题】:XSLT output does not displayXSLT 输出不显示
【发布时间】:2016-03-04 13:23:21
【问题描述】:

我是 XSLT 的新手。我正在尝试从 XSLT 生成文本文件。当我使用 XALAN 解析器对输入 XML 运行 XSLT 时,生成的文本文件没有输出。

这是 XSLT

<xsl:stylesheet version="2.0"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" />

<xsl:template match="/">
    <xsl:variable name="cities" as="xs:string*">
         <xsl:sequence select="addressbook/address/city" />
         <xsl:sequence select="'Virginia'" />
    </xsl:variable>
    <xsl:text>These are some of the cities:&#xA;&#xA;</xsl:text>
    <xsl:value-of select="$cities" separator="&#xA;" />
</xsl:template>

这是 XML

<?xml version="1.0" ?>
<addressbook>
 <address>
    <name>Peter Thompson</name>
    <stree>3456 South Blvd.</stree>
    <city>Chicago</city>
    <state>IL</state>
    <zip-code>34678</zip-code>
 </address>

 <address>
    <name>Jason Thompson</name>
    <stree>3456 Fort Main</stree>
    <city>South Carolina</city>
    <state>NC</state>
    <zip-code>67878</zip-code>
 </address>

我尝试这样编译:

java -classpath ~/Downloads/xalan/xalan.jar org.apache.xalan.xslt.Process -in cities.xml -xsl cities.xsl -out citiesop.txt

cities.txt 文件仅由输出生成:

这些是一些城市。

请帮助我了解这里出了什么问题。

【问题讨论】:

    标签: xml xslt xalan


    【解决方案1】:

    Xalan 仅支持 XSLT 1.0。由于version="2.0",它使用宽松的语法检查规则并简单地忽略&lt;xsl:sequence&gt; 元素。因此,您的变量 cities 为空。

    对于这个样式表,您需要使用 XSLT 2.0 引擎,例如 Saxon。

    【讨论】:

    • 或者简单地将版本标签更改为 1.0 和相应的命名空间。我在那里没有看到任何特定于 xslt2 的指令
    • @AydinK.xsl:sequencexsl:value-of@separatorxsl:variable@as
    • 这似乎不是正确的前向兼容行为。当运行 2.0 样式表的 1.0 处理器看到未知属性(如 @as)时,它应该忽略它,但当它尝试执行未知元素(如 xsl:sequence)时,它应该抛出错误。啊,好吧,我想它不会被修复。
    【解决方案2】:

    只需在 XSLT 1.0 中重写它:

    <xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text" />
    
    <xsl:template match="/">
        <xsl:text>These are some of the cities:&#xA;&#xA;</xsl:text>
        <xsl:for-each select="addressbook/address/city" >
            <xsl:value-of select="."/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
        <xsl:text>Virginia</xsl:text>
    </xsl:template>
    
    </xsl:stylesheet>
    

    附:南卡罗来纳州和弗吉尼亚州是,而不是城市

    【讨论】:

    • 大家好 .. 非常感谢您的 cmets。我用过撒克逊人,这很奏效。我知道版本是问题!
    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 2018-05-10
    • 1970-01-01
    • 2021-07-02
    • 2020-03-16
    • 2014-04-30
    • 2019-09-19
    • 2021-02-03
    相关资源
    最近更新 更多