Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用禁用输出转义转换XML混合节点_Xml_Xslt - Fatal编程技术网

使用禁用输出转义转换XML混合节点

使用禁用输出转义转换XML混合节点,xml,xslt,Xml,Xslt,关于这个问题的变体已经发布了,但我找不到任何解决基本情况的方法。我认为对这个问题的最简单版本有一个规范的答案会很好。这个问题假设XSLT1.0 我有一个包含混合节点的XML文档,例如: <paragraph> This is some text that is <bold>bold</bold> and this is some that is <italic>italicized.</italic> </p

关于这个问题的变体已经发布了,但我找不到任何解决基本情况的方法。我认为对这个问题的最简单版本有一个规范的答案会很好。这个问题假设XSLT1.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> 在我想使用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表单之间产生大量额外的处理代码。

如果我理解正确,您希望文本节点显示为literal text disable output escaping=yes,但是转换的其余部分应该正常工作到etc

模板模式可以帮助:

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

您是否希望etc显示为转义?很抱歉,没有更清楚。我希望文本被转义,但我希望能够继续匹配任何子节点,如粗体。