是否可以将属性从"book1chapter2"转换为"chapter2"?
例如这个节点:
<a myAttribute="part1chapter2" />
Run Code Online (Sandbox Code Playgroud)
应该转变成
<a myAttribute="chapter2" />
Run Code Online (Sandbox Code Playgroud)
我试过了:
<xsl:variable name="chapter" select="replace('part1chapter2', 'book1', '')" />
Run Code Online (Sandbox Code Playgroud)
但它导致编译错误:
ERROR: 'Error checking type of the expression 'funcall(replace, [literal-expr(part1chapter2), literal-expr(part1), literal-expr()])'.'
FATAL ERROR: 'Could not compile stylesheet'
Run Code Online (Sandbox Code Playgroud)
我使用XSLT 2.0版.
没有任何库的解决方案将是欣赏:)
编辑:
Java代码,用javac -g TestXslt.java编译和运行; java TestXslt;
public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("../transform.xslt"));
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(new File("../input.xml"));
String r = new String();
StreamResult result = new StreamResult(new File("../output.xml"));
transformer.transform(text, result);
}
Run Code Online (Sandbox Code Playgroud)
Java版本javac 1.6.0_27
我认为你想象在样式表上说版本="2.0"会自动为你提供一个XSLT 2.0处理器.这不是它的工作方式.您获得的处理器由您的类路径中的内容决定,如果您选择默认的JDK处理器,它只支持XSLT 1.0.XSLT 1.0的规范说如果它看到对诸如replace()之类的无法识别的函数的调用,它应该引发运行时错误.
要在XSLT 2.0下运行,请下载Saxon并确保它在您的类路径上.理想情况下,为了健壮性,不要依赖JAXP加载方法来查找它,而是明确加载它.代替
TransformerFactory factory = TransformerFactory.newInstance();
Run Code Online (Sandbox Code Playgroud)
做
TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
Run Code Online (Sandbox Code Playgroud)