转化与禁用输出转义XML混合节点(Transforming XML mixed nodes with

2019-07-03 18:49发布

在这个问题上的变化已张贴,但我找不到任何解决的基本情况。 我认为这将是很好的一个典型答案的问题的最简单的版本。 这个问题是假设XSLT 1.0。

我有一个包含混合节点,例如XML文档:

<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>

其中,直到我想使用禁用输出转义=“是”,这是XSL的一个属性的伟大工程:价值的。 有没有一种方法来选择混合节点的文本部分,我可以适用价值的嵌入式节点的独立?

这当然不行,因为我会失去子节点:

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

我知道我想做这可能代表了我处理XML的方式固有的问题,但许多XML的是由(信任)用户输入相当,天真地产生的事实,而我试图避免大量的XSLT-> HTML形式(如果可能)的XML-之间额外的处理代码>。

Answer 1:

如果我理解你的权利,你想文本节点出来作为文字文本( 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>


Answer 2:

我有一个类似的方案来处理(混合文本和节点内容处理节点); 这真的帮助: XSLT混合内容节点



文章来源: Transforming XML mixed nodes with disable-output-escaping
标签: xml xslt