exclude-result-prefixes和之间有什么区别extension-element-prefix?两者都用在XSLT的头文件中.我发现extension-element-prefix在使用EXSLT和EXSLT网站时Howto说它extension-element-prefix用于"阻止扩展命名空间在结果树中输出".
但事实并非如此(使用libxslt).仅exclude-result-prefixes删除扩展名称空间.那么我为什么需要extension-element-prefix???
样品:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common" version="1.0"
extension-element-prefix="exsl">
<xsl:template match="/">
<blabla/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
我的输出与libxslt(xsltproc):
<?xml version="1.0"?>
<blabla xmlns:exsl="http://exslt.org/common"/>
Run Code Online (Sandbox Code Playgroud) 除了重写大量的XSLT代码(我不打算这样做)之外,当上下文被任意设置为其他内容时,有没有办法在其父级中找到元素的位置?这是一个例子:
<!-- Here are my records-->
<xsl:for-each select="/path/to/record">
<xsl:variable name="record" select="."/>
<!-- At this point, I could use position() -->
<!-- Set the context to the current record -->
<xsl:for-each select="$record">
<!-- At this point, position() is meaningless because it's always 1 -->
<xsl:call-template name="SomeTemplate"/>
</xsl:for-each>
</xsl:for-each>
<!-- This template expects the current context being set to a record -->
<xsl:template name="SomeTemplate">
<!-- it does stuff with the record's fields -->
<xsl:value-of select="SomeRecordField"/>
<!-- How to access the record's position …Run Code Online (Sandbox Code Playgroud) 我想根据一个条件环境分配多个变量.我知道如何只为一个变量做到这一点:
<xsl:variable name="foo">
<xsl:choose>
<xsl:when test="$someCondition">
<xsl:value-of select="3"/>
<xsl:when>
<xsl:otherwise>
<xsl:value-of select="4711"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)
但是,如果我想根据相同的条件$ someCondition分配两个变量呢?
我不想再次编写相同的xsl:choose语句,因为它在实际示例中有点冗长且计算密集.
有问题的环境是带有exslt扩展的libxslt(xslt 1.0).
编辑:我想要的是一种类似的行为
if (condition) {
foo = 1;
bar = "Fred";
}
else if (...) {
foo = 12;
bar = "ASDD";
}
(... more else ifs...)
else {
foo = ...;
bar = "...";
}
Run Code Online (Sandbox Code Playgroud) 我有以下PHP代码,但它不起作用.我没有看到任何错误,但也许我只是失明.我在PHP 5.3.1上运行它.
<?php
$xsl_string = <<<HEREDOC
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:template match="/">
<p>Hello world</p>
<xsl:variable name="person">
<firstname>Foo</firstname>
<lastname>Bar</lastname>
<email>test@example.com</email>
</xsl:variable>
<xsl:value-of select="exsl:node-set(\$person)/email"/>
</xsl:template>
</xsl:stylesheet>
HEREDOC;
$xml_dom = new DOMDocument("1.0", "utf-8");
$xml_dom->appendChild($xml_dom->createElement("dummy"));
$xsl_dom = new DOMDocument();
$xsl_dom->loadXML($xsl_string);
$xsl_processor = new XSLTProcessor();
$xsl_processor->importStyleSheet($xsl_dom);
echo $xsl_processor->transformToXML($xml_dom);
?>
Run Code Online (Sandbox Code Playgroud)
此代码应输出"Hello world",然后输出"test@example.com",但不会显示电子邮件部分.知道什么是错的吗?
-Geoffrey Lee
我有一堆XSLT文件,我需要处理一些XML文件.我无法更改XSLT文件,因为它们来自第三方.XSLT是2.0版.
我使用的是Mac OS X 10.6,它看起来像Saxon-HE是唯一可用的XSLT 2.0处理器.
大多数XSLT的工作正常,但有些会给出有关缺失函数的错误,特别是month-in-year()其他日期/时间相关的函数.
根据 关于EXSLT的http://www.saxonica.com/documentation/extensions/exslt.xml:
这些扩展可在Saxon-PE和Saxon-EE中"开箱即用".它们不适用于Saxon-HE
无论如何我可以使用Saxon-HE的EXSLT功能吗?
如果可行,我很乐意转移到另一个工具/处理器.
有没有人Regexp在libxslt工作?什么时候,怎么样?
http://www.exslt.org/regexp/index.html
当使用xsltproc --dumpextensions带有最新libxslt 的命令时,我没有获得任何Regexp支持:-(
我正在转换XML文档。有一个属性@prettydate,该字符串是类似于“ 2010年5月7日,星期五”的字符串。我想拆分该字符串并添加指向月份和年份的链接。我正在使用该exslt:strings模块,并且可以添加任何其他必要的EXSLT模块。
到目前为止,这是我的代码:
<xsl:template match="//calendar">
<xsl:variable name="prettyparts">
<xsl:value-of select="str:split(@prettydate,', ')"/>
</xsl:variable>
<table class='day'>
<thead>
<caption><xsl:value-of select="$prettyparts[1]"/>,
<a>
<xsl:attribute name='href'><xsl:value-of select="$baseref"/>?date=<xsl:value-of select="@highlight"/>&per=m</xsl:attribute>
<xsl:value-of select='$prettyparts[2]'/>
</a>
<xsl:value-of select='$prettyparts[3]'/>,
<a>
<xsl:attribute name='href'><xsl:value-of select="$baseref"/>?date=<xsl:value-of select="@highlight"/>&per=y</xsl:attribute>
<xsl:value-of select='$prettyparts[4]'/>
</a>
</caption>
<!--etcetera-->
Run Code Online (Sandbox Code Playgroud)
我已经通过运行$ prettyparts验证了<xml:for-each/>我正在获得预期的节点集:
<token>Friday</token>
<token>May</token>
<token>7</token>
<token>2010</token>
Run Code Online (Sandbox Code Playgroud)
但是,无论我尝试以哪种方式<token>直接引用某个特定对象(而不是在foreach中),我都不会得到与无效类型有关的任何错误或各种错误。这是我尝试过的一些语法:
<xsl:value-of select="$prettyparts[2]"/>
<xsl:value-of select="$prettyparts/token[2]"/>
<xsl:value-of select="exsl:node-set($prettyparts/token[2])"/>
<xsl:value-of select="exsl:node-set($prettyparts/token)[2]"/>
Run Code Online (Sandbox Code Playgroud)
知道表达应该是什么吗?
预计到达时间:感谢@DevNull的建议,正确的表达为:
<xsl:value-of select="exsl:node-set($prettyparts)[position()=2]"/>
Run Code Online (Sandbox Code Playgroud)
并且,我必须以这种方式设置变量:
<xsl:variable name="prettyparts" select="str:split(@prettydate,', ')" />
Run Code Online (Sandbox Code Playgroud) 我一整天都在寻找这个问题的答案.我正在为中等大小的XML文档(~1.5MB,~1000个元素)创建样式表,这给我带来了很多麻烦.它是关于为不同的加工厂设备创建事件 - 时间线图.XML是通过SAP MII QueryTempalte thingy生成的,并且采用/ Rowsets/Rowset/Row格式.所有这些数据都以/设备/设备/事件格式处理并存储在本地节点集中.然后将此节点集处理为HTML,然后在浏览器中呈现.现在,我开始遇到麻烦了.我可以轻松地提取过去5天的数据,从而导致来自MII的约900行数据,并被处理为我的节点格式,导致不到900行.但第二个我从MII获取了1017行,样式表只会渲染大约一半,然后停止并且"没有更多的DTM ID可用"异常.现在,MII服务器只运行JDK 1.5.x,我读过,这可能是一个问题 - 唯一的问题是,我对此无能为力.所以现在我在这里问:有没有办法优化我的代码?我为我的XSL和示例XML附加了一些链接.
XSL:http: //pastie.org/1566517 Samlpe XML:http://pastie.org/1566522
现在,示例XML可能不会产生任何"有趣"的可视结果,并且无法复制错误.但是,如果有人能够发现obvoius优化,我很想知道:)我一直在想,替换/移动startOffset,endOffset等的计算会很好,但我无法弄清楚如何.
希望可以有人帮帮我!:)
我在XSLT 2.0中尝试日期格式化.当我尝试在我的工作区中运行它时运行正常,我得到了适当的响应.但是当我在JBoss eap 6.1上部署我的jar后尝试实现相同的功能时,我得到以下错误:
16:35:02,311错误[XSLTUtil](DefaultQuartzScheduler-camel-12_Worker-2)XSLTUtil | 0 | TransformerException:使用xslt文件转换xml时出错:javax.xml.transform.TransformerException:org.xml.sax.SAXException:找不到函数:format-dateTime javax.xml.transform.TransformerException:找不到函数:format-dateTime |
我的Xsl文件:这里我试图使用format-dateTime将当前日期格式化为其他格式.
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='2.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:func="http://exslt.org/functions"
xmlns:date="http://exslt.org/dates-and-times"
date:doc="http://www.exslt.org/date" exclude-result-prefixes="date func">
<xsl:import href="date.xsl"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:max="http://www.ibm.com/maximo">
<soapenv:Header/>
<soapenv:Body>
<max:CreateMXINCIDENT_WSTB creationDateTime="" baseLanguage="" transLanguage="" messageID="" maximoVersion="">
<max:MXINCIDENT_WSTBSet>
<max:MXINCIDENT_WST action="" relationship="" deleteForInsert="" transLanguage="">
<max:MAXINTERRORMSG></max:MAXINTERRORMSG>
<max:ACTIVITY changed="true">
<xsl:value-of select='/tTroubleticket/activity' />
</max:ACTIVITY>
<max:BLOCK changed="">
<xsl:value-of select='/tTroubleticket/block' />
</max:BLOCK>
<max:CHANGEBY changed="true">AOS</max:CHANGEBY>
<max:CHANGEDATE changed="true">
<xsl:value-of select="format-dateTime(current-dateTime(), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]')" />
</max:CHANGEDATE>
<max:CLASS changed="true">INCIDENT</max:CLASS>
<max:COMMERRORTYPE changed="true">
<xsl:value-of select='/tTroubleticket/commErrorType' />
</max:COMMERRORTYPE> …Run Code Online (Sandbox Code Playgroud) 在创建带参数的函数时需要一些帮助,并且可以在我的模板中使用该函数。尝试了很多事情但没有任何结果。下面是我的示例代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:math="http://exslt.org/math"
xmlns:func="http://exslt.org/functions"
xmlns:my="http://exslt.org/my"
exclude-result-prefixes="my"
extension-element-prefixes="my math func">
<xsl:output indent="yes" method="xml" />
<xsl:variable name="functionTest11">
<xsl:value-of select="my:calXY('aa')" />
</xsl:variable>
<xsl:template match="/">
<svg xmlns="http://www.w3.org/2000/svg">
<xsl:variable name="functionTest22">
<xsl:value-of select="my:calXY" />
</xsl:variable>
<xsl:comment>functionTest <xsl:copy-of
select="$functionTest22" /></xsl:comment>
</svg>
</xsl:template>
<func:function name="my:calXY">
<xsl:comment>functionHello </xsl:comment>
<xsl:param name="string1" select="''"/>
<func:result>
<xsl:value-of select="concat(10,'|',10)" />
</func:result>
</func:function>
</xsl:stylesheet>Run Code Online (Sandbox Code Playgroud)