我们如何使用xslt以换行方式获取数据值

时间:2011-12-13 07:20:45

标签: xslt

这里我已经粘贴了一个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,银行代码,国家/地区代码,国家代码

3 个答案:

答案 0 :(得分:0)

显然使用XML很糟糕。 XML的重点是你不需要任何其他解析,在这里你确实需要一个解析,即在换行符上拆分。无论如何,当你已经拥有它时,你可以使用核心XPath函数substring-beforesubstring-after拆分换行符。

第一行应该是

substring-before(value, '&#10;')

(这是一个xpath表达式,所以你必须把它放入或者类似的标签),其余的行应该是

substring-after(value, '&#10;')

你可以将这两者结合起来,所以第二行是

substring-before(substring-after(value, '&#10;'), '&#10;')

第三行是

substring-before(substring-after(substring-after(value, '&#10;'), '&#10;'), '&#10;')

PS:我不确定您是否需要使用&#10;\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(., '&#10;')">
    <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(., '&#10; &#9;&#13;', ',')"/>
 </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(., '&#10;', ','))"/>
 </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(., '&#xd;?&#xa;')"/>

  <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