XSLT 1.0: подстрока нескольких значений - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий элемент и значение:

XML:

<Location>Wing: ; Room: A; Bed: NAH; Group: 195;</Location>

Я пытаюсь вставить каждое значение в отдельный элемент.

Мой текущий XSLT:

<PL.1>
      <xsl:value-of select="substring-before(//Location, ' ; Room:')" />
</PL.1>
<PL.2>
      <xsl:value-of select="substring-before(//Location, 'Bed:')" />
</PL.2>
<PL.3>
      <xsl:value-of select="substring-before(//Location, 'Group:')" />
</PL.3>
<PL.4>
      <xsl:value-of select="substring-after(//Location, 'Group:')" />
</PL.4>

Ожидаемый результат, к которому я стремлюсь, следующий:

<PL.1>Wing: ;</PL.1>
<PL.2>Room: A;</PL.2>
<PL.3>Bed: NAH;</PL.3>
<PL.4>Group: 195;</PL.4>

Я знаю свойПодстрока неверна, но я не уверен в правильном способе указать определенные точки.Примеры, которые я видел, не вызывают переменную и обычно разделяют только две вещи, поэтому мне трудно разобраться с концепцией выделения более двух элементов.

Текущие результаты поXSLT:

<PL.1>Wing:</PL.1>
<PL.2 />
<PL.3> 195;</PL.3>
<PL.4 />

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Используйте рекурсивный шаблон, как в этом решении XSLT-1.0:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/root">                        <!-- Adapt to your real conditions -->
    <xsl:call-template name="NextStr">
      <xsl:with-param name="str" select="Location" /> <!-- Change to //Location if appropriate -->
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="NextStr"> 
    <xsl:param name="str" />
    <xsl:param name="cnt" select="1" />
    <xsl:if test="normalize-space($str)">
      <xsl:element name="{concat('PL.',$cnt)}">
        <xsl:value-of select="normalize-space(concat(substring-before($str,';'),';'))" />
      </xsl:element>
      <xsl:call-template name="NextStr">
        <xsl:with-param name="str" select="substring-after($str,';')" />
        <xsl:with-param name="cnt" select="$cnt + 1" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Эта таблица стилей получает имена элементов PL.x из счетчика, переданного в именованный шаблон NextStr.Вы можете удалить конечный ;, удалив соответствующий concat(...) из выражения.

Вывод:

<PL.1>Wing: ;</PL.1>
<PL.2>Room: A;</PL.2>
<PL.3>Bed: NAH;</PL.3>
<PL.4>Group: 195;</PL.4>
0 голосов
/ 11 мая 2018
<xsl:template match="Location">
        <xsl:variable name="a" select="substring-before(.,' Room')"/>
        <xsl:variable name="b" select="substring-before(substring-after(.,'Wing: ; '), ' Bed')"/>
        <xsl:variable name="c" select="substring-before(substring-after(.,' Room: A; '),' Group')"/>
        <xsl:variable name="d" select="substring-after(.,'NAH; ')"/>
        <PL.1>
            <xsl:value-of select="$a"/>
        </PL.1>
        <PL.2>
            <xsl:value-of select="$b"/>
        </PL.2>
        <PL.3>
            <xsl:value-of select="$c"/>
        </PL.3>
        <PL.4>
            <xsl:value-of select="$d"/>
        </PL.4>
    </xsl:template>
Use this code
0 голосов
/ 11 мая 2018

Попробуйте использовать

<PL.1>
      <xsl:value-of select="substring-before(//Location, ' ; Room:')" />
</PL.1>
<PL.2>
      <xsl:value-of select="substring-before(//Location, ';Bed:')" />
</PL.2>
<PL.3>
      <xsl:value-of select="substring-before(//Location, ';Group:')" />
</PL.3>
<PL.4>
      <xsl:value-of select="substring-after(//Location, ';Group:')" />
</PL.4>
...