2013-03-22 71 views
1

我想用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()); 

} 
+0

你能告诉我们你在哪里试图提取该值的XSLT的部分? – JLRishe 2013-03-22 15:23:59

+0

我不知道它是否重要,但所有元素中的文本都包含在CDATA中。 (问题已更新) – 2013-03-22 15:52:08

+0

您可能会感兴趣的是,您接受的答案不正确。 – 2013-03-22 16:21:50

回答

1

您当前的XPath WIL我评估一个节点集,但你需要的是一个字符串。请尝试是这样的:

<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的部分,你正试图输出这个值。

+0

它在该解决方案中正常工作。非常感谢 – 2013-03-22 16:00:23

+0

这让我们假设红色“key”后面的下一个'value'元素是所寻找的'value'元素,我认为这是一个安全的假设。 – JLRishe 2013-03-22 16:52:27

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></value> 
      <key>RED</key> 
      <value>98472978241908</value> 
      <key>BLACK</key> 
      <value>987654321</value> 
     </node2> 
    </nodelevelY> 
</nodelevelX> 

XPath表达式进行评估,此评估的结果复制到输出:

1908 
相关问题