「赤」の兄弟の最後の 4 つの数字を xpath で抽出しようとしています。
ソース xml は次のようになります。
...
<node2>
<key><![CDATA[RED]]></key>
<value><![CDATA[98472978241908]]></value>
... more key value pairs here...
</node2>
...
そして、次の xpath を使用すると:
/nodelevelX/nodelevelY/node2/key[text()='RED']/following-sibling::value
出力に完全な数値があるので、このxpath experssionで数字を抽出しようとしました:
/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) に関する多くの議論に従い、アドバイスに従おうとしましたが成功しませんでした。
更新: コンテキスト:
ソース XML から宛先 (xml) にすべてのノードをコピーする次の ID を使用し、xsl:template 内の後でいくつかのノードに特定のルールを適用します。
<!-- 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 (JDK 6) の junit クラスから次のコードを使用します。
@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());
}