xslt删除属性的一部分

Cha*_*les 1 xml xslt xslt-2.0

是否可以将属性从"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

Mic*_*Kay 6

我认为你想象在样式表上说版本="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)