我的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”。
我只是不知道如何做这个子串分割,以区分文本和数值。
答案 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>
<强>解释强>:
双翻译方法。
正确使用substring-before()
和normalize-space()
。
答案 2 :(得分:1)
您应该能够标记:http://www.w3schools.com/xpath/xpath_functions.asp
如果您知道所有节点都由三个空格分隔,那么这可能是一个很好的方法,或者您可以使用正则表达式并从节点内容的末尾向后工作。