Удаление двойных кавычек и слэшей в XSLT - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь отфильтровать проблемные символы (кавычки и косые черты) во время перевода XSLT, но не могу их удалить.Я попробовал несколько предложенных здесь решений, и они оказались безуспешными:

Заменить специальные символы в XSLT

Удаление двойных кавычек в XSL

XSL: заменить одинарные и двойные кавычки на 'и "

В идеале я хотел бы заменить символы каким-либо помеченным словом, например кавычки или косая черта , но в этот момент все будет в порядке, просто пока их убираю.

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

<xsl:value-of select="ns3:stepTitle"/>

РЕДАКТИРОВАТЬ:

Необходимо использовать XML 1.0.

XSLT:

<?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" indent="yes"/>

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

    <xsl:template match="*/text()">
        <xsl:value-of select="translate(., '\&quot;', '*quote*')"/>
    </xsl:template>

</xsl:stylesheet>

XML:

<test>
  I need to remove "quotes" and slashes /\ from here.
</test>

Результат был:

<?xml version="1.0" encoding="UTF-16"?>
<test>
  I need to remove qquotesq and slashes /* from here.
</test>

Ответы [ 2 ]

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

Возможно, недостаточно широко известная особенность функции translate состоит в том, что строка replace (3-й аргумент) может быть на короче , чем строка из (2-й аргумент).

В этом случае символы из строки source (1-й аргумент), которые:

  • встречаются в from Строка,
  • , но не имеет соответствующих символов в Заменить Строка

удаляются.

Поэтому вы должны использовать translate(., '/&quot;', '').

Строка из имеет 2 символа: косая черта (/) и двойная кавычка &quot;, а строка replace пуста, поэтому обаэти символы будут удалены.

Пример сценария приведен ниже:

<?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" indent="yes"/>

  <xsl:template match="*/text()">
    <xsl:value-of select="translate(., '/&quot;', '')"/>
  </xsl:template>

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

Примечание. В вашем примере вы добавили обратную косую черту (не прямую косую черту).

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

Неясно на 100%, в чем ваша проблема, но я предполагаю, что это вариант проблемы, описанной в этой старой теме 2001 .Если это так, то ниже приведен пример таблицы стилей XSLT 1.0 для замены символов апострофов ASCII на символы U + 2019 RIGHT SINGLE QUOTATION MARK (кодовая точка Unicode 8217 в десятичном формате).«Хитрость» состоит в том, чтобы определить переменную, содержащую односимвольную строку, содержащую символ апострофа, а затем использовать эту переменную в вызовах translate() (но также можно использовать с concat() для создания строк с символами апостроф):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="text()">
    <xsl:variable name="apos" select='"&apos;"'/>
    <xsl:variable name="string-containing-quotes" select="."/>
    <xsl:variable name="string-with-quotes-replaced"
         select="translate($string-containing-quotes, $apos, '&#8217;')"/>
    <xsl:value-of select="$string-with-quotes-replaced"/>
  </xsl:template>
</xsl:stylesheet>

Вы можете протестировать таблицу стилей с помощью входного XML-документа, например

<test>
  Text containing 'apostrophe' characters
</test>
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...