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的一个属性。是否有一种方法可以选择混合节点的文本部分,我可以对其应用独立于嵌入节点的值

当然,这不起作用,因为我会丢失子节点:

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


我知道我试图这样做的事实可能代表了我处理XML的方式中的一个固有问题,但大部分XML都是由(受信任的)用户输入生成的,我试图避免在XML->XSLT->HTML表单(如果可能)之间产生大量额外的处理代码。

如果我理解正确,您希望文本节点显示为文本(
禁用输出转义=“yes”
),但转换的其余部分应正常工作(
等)

模板模式可以帮助:

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



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