Разделить строку на две части в XPath - PullRequest
5 голосов
/ 08 марта 2012

Мой XML-источник выглядит так:

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

и у меня есть соответствующий шаблон

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

Моя трудность теперь связана с этим шаблоном соответствия, мне нужно создать два тега, первый будет содержать строку «Проблемы с грудью (женский и мужской)», а второй содержит только номер страницы «511».

Я просто не знаю, как сделать это разбиение подстроки, чтобы различать текст и числовое значение.

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Решение 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>
3 голосов
/ 09 марта 2012

В 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().

1 голос
/ 09 марта 2012

Вы должны быть в состоянии токенизировать: http://www.w3schools.com/xpath/xpath_functions.asp

Если вы знаете, что все ваши узлы разделены тремя пробелами, это может быть хорошим способом, или вы можете использовать регулярное выражение и работать в обратном направлении от конца содержимого узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...