我想用xpath提取最后4个“红色”兄弟节点的数字。XSLT:用xpath表达式提取兄弟节点的最后x位
源XML看起来像:
...
<node2>
<key><![CDATA[RED]]></key>
<value><![CDATA[98472978241908]]></value>
... more key value pairs here...
</node2>
...
当我使用follwing的XPath: /nodelevelX/nodelevelY/node2/key[text()='RED']/following-sibling::value
我在输出的完整号码,然后我试图提取与此XPath表达研究数字:
/nodelevelX/nodelevelY/node2/key[text()='RED']/following-sibling::value/text()[substring(., string-length(.)-4)]
我仍然有完整的电话号码。子字符串函数似乎不起作用。
我的XSL头是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
我觉得这是一个小错误,但我看不到的地方。我跟踪了许多关于SO和其他人(w3schools)的讨论,并试图在没有成功的情况下遵循这些建议。
UPDATE:上下文:
我用下面的身份,从我的源XML复制所有节点到目的地(XML) 和我申请的具体规则,一些节点后,里面的xsl:模板:
<!-- This copy the whole source XML in destination -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- specific rules for some nodes -->
<xsl:template match="/nodeDetails">
<mynewnode>
<!-- here I take the whole value and it s working -->
<someVal><xsl:value-of select="/nodeDetails/nodeX/key[text()='ANOTHER_KEY']/following-sibling::value" /></someVal>
<!-- FIXME substring does not work now -->
<redVal><xsl:value-of select="/nodeDetails/nodeX/key[text()='RED']/following-sibling::value/text()[substring(.,string-length(.)-4)]" /></redVal>
</mynewnode>
</xsl:template>
而对于我在Java中使用下面的代码从JUnit类的变换(JDK 6):
@Test
public void transformXml() throws TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(getClass().getResourceAsStream("contract.xsl"));
Transformer transformer = factory.newTransformer(xslt);
Source input = new StreamSource(getClass().getResourceAsStream("source.xml"));
Writer output = new StringWriter();
transformer.transform(input, new StreamResult(output));
System.out.println("output=" + output.toString());
}
你能告诉我们你在哪里试图提取该值的XSLT的部分? – JLRishe 2013-03-22 15:23:59
我不知道它是否重要,但所有元素中的文本都包含在CDATA中。 (问题已更新) – 2013-03-22 15:52:08
您可能会感兴趣的是,您接受的答案不正确。 – 2013-03-22 16:21:50