1

「赤」の兄弟の最後の 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());

}
4

2 に答える 2

1

現在の XPath はノードセットに評価されますが、必要なのは文字列です。次のようなことを試してください:

<xsl:variable name="value" 
              select="/nodelevelX/nodelevelY/node2/key[. = 'RED']
                      /following-sibling::value[1]" />
<xsl:value-of select="substring($value, string-length($value) - 3)" />

答えを確認するには、この値を出力しようとしている XSLT の部分を確認する必要があります。

于 2013-03-22T15:27:19.973 に答える
0

次の XPath 2.0 式を使用します

/nodelevelX/nodelevelY/node2/key[text()='RED']
                    /following-sibling::*[1][self::value]
                            /substring(., string-length() -3)

XSLT 2.0 - ベースの検証:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/nodelevelX/nodelevelY/node2/key[text()='RED']
                    /following-sibling::*[1][self::value]
                            /substring(., string-length() -3)"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<nodelevelX>
    <nodelevelY>
        <node2>
            <key>GREEN</key>
            <value>0123456789</value>
            <key>RED</key>
            <value>98472978241908</value>
            <key>BLACK</key>
            <value>987654321</value>
        </node2>
    </nodelevelY>
</nodelevelX>

XPath 式が評価され、この評価の結果が出力にコピーされます。

1908
于 2013-03-22T15:48:32.767 に答える