2011-11-19 16 views
3

如果最后一行的数据等于个人意味着需要填充为1100,那么试图从标签获得最后数据然后需要填充为1100其他数据表示应该填充的数据 这里是我下面的xml:如何通过使用xslt从xml中获取最后一行数据

<tag> 
    <name>20K</name> 
    <value>540211000000100155001 
    0100155XXXXXX 
    0100156XXXXX 
    0100157XXXXXXX 
    0100159XXXXXXXX 
    personal</value> 
</tag> 

如何使用XSLT逻辑可以在任何一个指导我

回答

1

一,这是在XSLT 2.0这样做短而简单的方法:

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

<xsl:template match="/*/value"> 
    "<xsl:sequence select="tokenize(., '(&#xD;)?&#xA;')[last()]"/>" 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

当该变换被应用到所提供的XML文档

<tag> 
    <name>20K</name> 
    <value>540211000000100155001 
    0100155XXXXXX 
    0100156XXXXX 
    0100157XXXXXXX 
    0100159XXXXXXXX 
    personal</value> 
</tag> 

有用,正确的结果产生

" personal" 

II。 XSLT 1.0溶液

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="value" name="skipLines"> 
    <xsl:param name="pText" select="."/> 
    <xsl:choose> 
     <xsl:when test="not(contains($pText, '&#xA;'))"> 
     "<xsl:value-of select="$pText"/>" 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:call-template name="skipLines"> 
     <xsl:with-param name="pText" select= 
      "substring-after($pText, '&#xA;')"/> 
     </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

当该变换被应用到相同的XML文档(以上),再次同样正确的结果产生

" personal" 
+0

1虽然'( )'?不应该被需要,因为XML解析器会将CR + LF字符标准化为LF。你应该只能在' '上标记。 –

+0

@MadsHansen:是的,我非常清楚根据规范文本是什么*,但实际上可以配置'XmlReader'来保存'&#xD'。例如,在.NET中,“XmlTextReader.Normalization”可能被设置为false。 –

+0

有趣。我没有意识到.NET有这个选择。符合性XML解析器*必须*规范化为一个'#xA;'。 http://www.w3.org/TR/xml11/#sec-line-ends –

-2
<xsl:for-each select="//tag"> 
    <xsl:if test="contains(value/text(),"personal")"> 
    do stuff ... 
    </xsl:if> 
</xsl:for-each> 
just for inspiration :) 
相关问题