在XPath中将字符串拆分为两个

时间:2012-03-08 19:56:16

标签: xml xslt xpath

我的XML源代码如下:

<span class="char-style-override-6">Breast Problems (Female and Male)   511</span>

我有一个模板匹配

<xsl:template match="span" mode="table">

我现在的困难是在这个模板匹配中,我需要创建两个标签,第一个将包含字符串“Breast Problems(Female and Male)”,而第二个只包含页码“511”。

我只是不知道如何做这个子串分割,以区分文本和数值。

3 个答案:

答案 0 :(得分:3)

XSLT 2.0解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <output>
            <xsl:apply-templates mode="table"/>
        </output>
    </xsl:template>
    <xsl:template match="span" mode="table">
        <xsl:variable name="split" select="replace(., '.*\s(\d+)$', '$1')"/>
        <string><xsl:value-of select="normalize-space(substring-before(., $split))"/></string>
        <number><xsl:value-of select="$split" /></number>
    </xsl:template>
</xsl:stylesheet>

适用于

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <span class="char-style-override-6">Breast Problems (Female and Male)   511</span>
</root>

给出

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <string>Breast Problems (Female and Male)</string>
    <number>511</number>
</output>

答案 1 :(得分:3)

在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:template match="span">
  <xsl:variable name="vNumeric" select=
  "translate(., translate(., '0123456789', ''), '')"/>

  <xsl:variable name="vNonNumeric" select=
   "normalize-space(substring-before(., $vNumeric))"/>

  <nonNumeric><xsl:value-of select="$vNonNumeric"/></nonNumeric>
  <numeric><xsl:value-of select="$vNumeric"/></numeric>
 </xsl:template>
 </xsl:stylesheet>

在提供的XML文档上应用此转换时

<span class="char-style-override-6">Breast Problems (Female and Male)   511</span>

产生了想要的正确结果

<nonNumeric>511</nonNumeric>
<numeric>Breast Problems (Female and Male)</numeric>

<强>解释

  1. 双翻译方法

  2. 正确使用substring-before()normalize-space()

答案 2 :(得分:1)

您应该能够标记:http://www.w3schools.com/xpath/xpath_functions.asp

如果您知道所有节点都由三个空格分隔,那么这可能是一个很好的方法,或者您可以使用正则表达式并从节点内容的末尾向后工作。