XSLT конвертирует текст / специальные символы в HTML - PullRequest
0 голосов
/ 17 октября 2019

В моем XML-файле есть следующий узел с текстовым содержимым, закодированным в HTML для зарезервированных символов:

<seg>&lt;div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"&gt;&lt;iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen="" scrolling="no"&gt;&lt;/iframe&gt;&lt;/div&gt;</seg>

Я хочу обработать содержимое <seg> обратно в HTML с помощью XSLT 3.0 (вeXist-db) в процессе трансформации. В Xquery (также в eXist-db) я могу использовать util:parse() для этого, но я не смог идентифицировать те же функции в XSLT. Мне кажется, что xsl:result-document должен быть инструментом, но я даже не приблизился к тому, чтобы заставить его вывести полезную ошибку, чтобы найти решение, поэтому я не уверен, что это даже правильный подход.

Заранее спасибо.

Редактировать: Добавление двух попыток:

1.

<xsl:template match="seg">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

Вывод:

<?javax.xml.transform.disable-output-escaping?>&lt;div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"&gt;&lt;iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen scrolling="no"&gt;&lt;/iframe&gt;&lt;/div&gt;<?javax.xml.transform.enable-output-escaping?>

2.

<xsl:template match="seg">
    <xsl:value-of select="parse-xml-fragment(./text())"/>
</xsl:template>

выходы: ничего

1 Ответ

1 голос
/ 17 октября 2019

Чтобы преобразовать содержимое элемента <seg> в HTML, вы можете просто использовать (необязательный) атрибут disable-output-escaping из xsl:value-of:

<xsl:value-of select="seg" disable-output-escaping="yes" />

Этоне поддерживается всеми процессорами XSLT, поэтому попробуйте.
Вывод этого HTML:

<div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"><iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453?width=100%&height=100%" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen scrolling="no"></iframe></div>

Вы не можете легко обработать этот вывод дальше с процессором XSLT, потому что это не хорошо XML (это HTML):

  1. В атрибуте @src
  2. есть неэкранированный *1020* *1021* Атрибут HTML allowfullscreen не имеет значения (недопустимо в XML)

Но если вы действительно хотите обрабатывать его дальше, обработайте результат как строку, замените проблемные аспекты функцией fn:replace(), а затем используйте fn:parse-xml-fragment() функция для вывода соответствующего XML.

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