一,这是在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(., '(
)?
')[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, '
'))">
"<xsl:value-of select="$pText"/>"
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="skipLines">
<xsl:with-param name="pText" select=
"substring-after($pText, '
')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
当该变换被应用到相同的XML文档(以上),再次同样正确的结果产生:
" personal"
1虽然'( )'?不应该被需要,因为XML解析器会将CR + LF字符标准化为LF。你应该只能在' '上标记。 –
@MadsHansen:是的,我非常清楚根据规范文本是什么*,但实际上可以配置'XmlReader'来保存'&#xD'。例如,在.NET中,“XmlTextReader.Normalization”可能被设置为false。 –
有趣。我没有意识到.NET有这个选择。符合性XML解析器*必须*规范化为一个'#xA;'。 http://www.w3.org/TR/xml11/#sec-line-ends –