这里我已经粘贴了一个50G的样本xml,之前我用过使用crlf来获取下面这个标签的数据,但现在我想通过使用换行来获取,因为我需要正确的数据如果我问的话假设我想要换行1内容意味着AE012345677890 类似地,换行2意味着它应该通过使用xslt获取银行代码如何调用换行符。
<local>
<message>
<block4>
<tag>
<name>50G</name>
<value>AE012345677890
Bank code
country name
country code</value>
</tag>
</block4>
</message>
</local>
需要输出:
AE012345677890,银行代码,国家/地区代码,国家代码
答案 0 :(得分:0)
显然使用XML很糟糕。 XML的重点是你不需要任何其他解析,在这里你确实需要一个解析,即在换行符上拆分。无论如何,当你已经拥有它时,你可以使用核心XPath函数substring-before
和substring-after
拆分换行符。
第一行应该是
substring-before(value, ' ')
(这是一个xpath表达式,所以你必须把它放入或者类似的标签),其余的行应该是
substring-after(value, ' ')
你可以将这两者结合起来,所以第二行是
substring-before(substring-after(value, ' '), ' ')
第三行是
substring-before(substring-after(substring-after(value, ' '), ' '), ' ')
等
PS:我不确定您是否需要使用
或\n
换行。
答案 1 :(得分:0)
如果您使用的是XSLT 2.0,也可以使用tokenize
函数执行此操作:
<xsl:template match="value">
<!-- loop through each segment that's before a line break, output
its normalised value and add a comma if required -->
<xsl:for-each select="tokenize(., ' ')">
<xsl:value-of select="normalize-space(current())"/>
<xsl:if test="not(position()=last())">,</xsl:if>
</xsl:for-each>
</xsl:template>
这会产生所需的结果:
AE012345677890,Bank code,country name,country code
(正如Dimitre Novatchev在下面指出的那样,它也会将多个空白区域,即:每行内的空格和制表符折叠到一个单独的空间中,所以你可能想要试验一下,看看你的数据是否合适)
如果您仅限于XSLT 1.0,您可以实现也包含tokenize
的EXSLT库(请参阅tokenize page并单击左上角菜单中的“如何”了解更多信息关于实施图书馆的信息。)
答案 2 :(得分:0)
取决于不同组成类型的值空间(例如,如果知道它们不包含空格),这些简单的XSLT 1.0解决方案中的一个可能就是你的需要强>:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="value">
<xsl:value-of select=
"translate(., ' 	 ', ',')"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<强>可生产强>:
AE012345677890,Bankcode,countryname,countrycode
这次转型:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="value">
<xsl:value-of select=
"normalize-space(translate(., ' ', ','))"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<强>产生强>:
AE012345677890, Bank code, country name, country code
如果这两个XSLT 1.0转换都不满足您的要求,则可能需要执行trim
操作。 trim
中有 FXSL 功能/模板 - 随时可以使用。
<强> II。快速的XSLT 2.0解决方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="value">
<xsl:variable name="vLines" select="tokenize(., '
?
')"/>
<xsl:for-each select="$vLines">
<xsl:value-of select=
"translate(replace(., '(^[ \t\r]+)|([ \t\r]+$)', '~~'), '~', '')"/>
<xsl:if test="not(position() eq last())">,</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
产生完全想要的结果:
AE012345677890,Bank code,country name,country code