Элемент переноса XSLT и следующий текст - PullRequest
0 голосов
/ 14 декабря 2018

Пожалуйста, помогите мне обернуть элемент img.inline следующей запятой (если запятая существует):

text <img id="1" class="inline" src="1.jpg"/> another text.
text <img id="2" class="inline" src="2.jpg"/>, another text.

Следует изменить на:

text <img id="1" class="inline" src="1.jpg"/> another text.
text <span class="img-wrap"><img id="2" class="inline" src="2.jpg"/>,</span> another text.

В настоящее времямой XSLT обернет элемент img.inline и добавит запятую в промежуток, теперь я хочу удалить следующую запятую.

text <span class="img-wrap"><img id="2" class="inline" src="2.jpg"/>,</span>
, <!--remove this extra comma--> another text.

Мой XSLT:

<xsl:template match="//img[@class='inline']">
  <xsl:copy>
    <xsl:choose>
      <xsl:when test="starts-with(following-sibling::text(), ',')">
        <span class="img-wrap">
          <xsl:apply-templates select="node()|@*"/>
          <xsl:text>,</xsl:text>
        </span>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:copy>

  <!-- checking following-sibling::text() -->
  <xsl:apply-templates select="following-sibling::text()" mode="commatext"/>
</xsl:template>

<!-- here I want to match the following text, if comma, then remove it -->  
<xsl:template match="the following comma" mode="commatext">
  <!-- remove comma -->
</xsl:template>

Правильный ли мой подход?или это что-то надо обрабатывать по другому?Просьба предложить?

1 Ответ

0 голосов
/ 14 декабря 2018

В настоящее время вы копируете img и встраиваете span в него.Кроме того, вы делаете <xsl:apply-templates select="node()|@*"/>, который выберет дочерние узлы img (или их нет).А для атрибутов он закончится, добавьте их к span.

. Здесь вам не нужно xsl:choose, поскольку вы можете добавить условие к атрибуту match.

<xsl:template match="//img[@class='inline'][starts-with(following-sibling::node()[1][self::text()], ',')]">

Примечание. Я изменил условие, поскольку following-sibling::text() выбирает ВСЕ текстовые элементы, следующие за узлом img.Вы хотите получить узел сразу после узла img, но только если это текстовый узел.

Кроме того, попытка выделить следующий текстовый узел с помощью xsl:apply-templates, вероятно, не является правильным подходом,при условии, что у вас есть шаблон, соответствующий родительскому узлу, который выбирает все дочерние узлы (а не только img).Я предполагаю, что вы использовали шаблон идентификации здесь.

В любом случае, попробуйте этот XSLT вместо

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html" indent="no" />

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
</xsl:template>

<xsl:template match="//img[@class='inline'][starts-with(following-sibling::node()[1][self::text()], ',')]">
  <span class="img-wrap">
    <xsl:copy-of select="." />
    <xsl:text>,</xsl:text>
  </span>
</xsl:template>

<xsl:template match="text()[starts-with(., ',')][preceding-sibling::node()[1][self::img]/@class='inline']">
  <xsl:value-of select="substring(., 2)" />
</xsl:template>

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