Преобразование смешанных узлов XML с отключением-выводом - PullRequest
3 голосов
/ 26 августа 2009

Вариации по этому вопросу были опубликованы, но я не смог найти ни одного, который касался базового варианта. Я подумал, что было бы хорошо иметь канонический ответ на простейшую версию проблемы. Этот вопрос предполагает xslt 1.0.

У меня есть документ XML, который содержит смешанные узлы, например ::1003

<paragraph>
     This is some text that is <bold>bold</bold> 
     and this is some that is <italic>italicized.</italic>
</paragraph>

Я бы обычно использовал преобразование, которое выглядит примерно так:

<xsl:template match="bold">
    <b><xsl:apply-templates/></b>
</xsl:template>
<xsl:template match="italic">
    <i><xsl:apply-templates/></i>
</xsl:template>
<xsl:template match="paragraph">
    <p><xsl:apply-templates/></p>
</xsl:template>

, который прекрасно работает, пока я не хочу использовать disable-output-escaping = "yes", который является атрибутом xsl: value-of. Есть ли способ выбрать текстовую часть смешанного узла, к которому я могу применить значение, независимое от встроенных узлов?

Это, конечно, не работает, потому что я потерял бы дочерние узлы:

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

Я знаю, что тот факт, что я пытаюсь это сделать, вероятно, представляет собой врожденную проблему в способе обработки XML, но большая часть XML создается довольно (наивно) с помощью (доверенного) пользовательского ввода, и я пытаюсь Избегайте большого количества дополнительного кода обработки между формой XML-> XSLT-> HTML (если возможно).

Ответы [ 2 ]

2 голосов
/ 26 августа 2009

Если я вас правильно понял, вы хотите, чтобы текстовые узлы выглядели как буквальный текст (disable-output-escaping="yes"), но остальная часть преобразования должна работать нормально (<bold> до <b> и т.

Шаблонные режимы могут помочь:

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

  <xsl:template match="paragraph">
    <p>
      <xsl:apply-templates mode="literal" />
    </p>
  </xsl:template>

  <!-- literal templates (invoked in literal mode) -->
  <xsl:template match="bold" mode="literal">
    <b><xsl:apply-templates mode="literal"/></b>
  </xsl:template>
  <xsl:template match="italic" mode="literal">
    <i><xsl:apply-templates mode="literal"/></i>
  </xsl:template>
  <xsl:template match="text()" mode="literal">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <!-- normal templates (invoked when you don't use a template mode) -->
  <xsl:template match="bold">
    <b><xsl:apply-templates /></b>
  </xsl:template>
  <xsl:template match="italic">
    <i><xsl:apply-templates /></i>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 03 сентября 2011

У меня был похожий сценарий (обработка узлов со смешанным текстом и содержимым узлов); это действительно помогло: узел смешанного контента XSLT

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