Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.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
Html 如何处理XSLT中嵌入的XML标记?_Html_Xml_Xslt_Formatting - Fatal编程技术网

Html 如何处理XSLT中嵌入的XML标记?

Html 如何处理XSLT中嵌入的XML标记?,html,xml,xslt,formatting,Html,Xml,Xslt,Formatting,我正在使用XSLT将XML转换为HTML。我很难弄清楚如何处理用于格式化的嵌入式XML节点。例如,假设我有XML元素: 星球大战传奇 但是,在XLST期间,标记被忽略,因此“星球大战”在HTML输出中不是斜体。有没有相对简单的方法来解决这个问题 test.xml: <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="test.html.xsl"?> <favori

我正在使用XSLT将XML转换为HTML。我很难弄清楚如何处理用于格式化的嵌入式XML节点。例如,假设我有XML元素:

星球大战传奇

但是,在XLST期间,
标记被忽略,因此“星球大战”在HTML输出中不是斜体。有没有相对简单的方法来解决这个问题

test.xml:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.html.xsl"?>
<favoriteMovies>
    <favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>
</favoriteMovies>

星球大战传奇
test.html.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" />
    <xsl:template match="/">
      <html>
        <head />
          <body>
            <ul>
                <xsl:for-each select="favoriteMovies/favoriteMovie">
                    <li><xsl:value-of select="." /></li>
                </xsl:for-each>
            </ul>
          </body>
      </html>
    </xsl:template>
</xsl:stylesheet>

需要注意两件事

首先。确保标记在CDATA中被屏蔽

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.html.xsl"?>
<favoriteMovies>
    <favoriteMovie><![CDATA[the <i>Star Wars</i> saga]]></favoriteMovie>
</favoriteMovies>

星球大战传奇]]>
第二。禁用输出转义:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
  <html>
    <head />
      <body>
        <ul>
            <xsl:for-each select="favoriteMovies/favoriteMovie">
                <li><xsl:value-of select="." disable-output-escaping="yes" /></li>
            </xsl:for-each>
        </ul>
      </body>
  </html>
</xsl:template>

编辑:用编辑器管理它,现在代码显示为它应该显示的样子

EDIT2:在代码中包含更改


EDIT3:对于它可能关心的人来说,问题的核心领域是构建电影信息,而不是html数据。HTML仅用于标记目的,想象一下,比如说,在favoriteMovie中有HTML标题标记,而相同的命名标记标题可能是电影数据库中的有效标记。这些标题显然必须有不同的解释。这证明了在处理时使用CDATA然后禁用输出的合理性。

您应该使用xsl:copy来复制i节点


  • 但是,在XLST期间,
    标记会 被忽略,所以《星球大战》不是 HTML输出中的斜体。是 有一个相对简单的方法来修复 这个

    你的问题就在这里

    <favoriteMovies>
        <favoriteMovie>the 
            <i>Star Wars</i> saga
        </favoriteMovie>
    </favoriteMovies>
    
    <html>
        <head/>
        <body>
            <ul>
                <li>the 
                    <i>Star Wars</i> saga
                </li>
            </ul>
        </body>
    </html>
    
    另一种更符合XSLT原则的解决方案完全避免使用

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/">
      <html>
        <head />
        <body>
         <xsl:apply-templates/>
        </body>
      </html>
     </xsl:template>
    
     <xsl:template match="/*">
      <ul>
       <xsl:apply-templates/>
      </ul>
     </xsl:template>
    
     <xsl:template match="favoriteMovie">
      <li><xsl:copy-of select="node()"/></li>
     </xsl:template>
    </xsl:stylesheet>
    
    
    
  • 当上述两种解决方案中的任何一种应用于提供的XML文档时

    <favoriteMovies>
        <favoriteMovie>the 
            <i>Star Wars</i> saga
        </favoriteMovie>
    </favoriteMovies>
    
    <html>
        <head/>
        <body>
            <ul>
                <li>the 
                    <i>Star Wars</i> saga
                </li>
            </ul>
        </body>
    </html>
    
    
    这个
    星球大战传奇
    
    生成所需的正确结果

    <favoriteMovies>
        <favoriteMovie>the 
            <i>Star Wars</i> saga
        </favoriteMovie>
    </favoriteMovies>
    
    <html>
        <head/>
        <body>
            <ul>
                <li>the 
                    <i>Star Wars</i> saga
                </li>
            </ul>
        </body>
    </html>
    
    
    
    • 星球大战传奇

    您应该使用“禁用输出转义”属性。元素的一般格式为:

    <xsl:value-of select="expression" disable-output-escaping="yes|no" />
    
    
    

    “禁用输出转义”是可选的。“是”表示特殊字符(如"1.无法按预期工作;HTML最终看起来像:iStar Wars/i sagaUsing gt和lt实体是我试图解决编辑器问题的尝试,不要在文档中使用它们。重点是使用CDATA将HTML标记包装到XML标记中。2.似乎没有任何改变,标记仍然忽略。1.使用,不是我,但它不起作用正如所料,它显示在原始HTML中,就像我在前面的评论中指定的那样,在呈现的HTML中,它显示为“星球大战传奇”这显然不是我想要的。Re:EDIT 3-你似乎在试图回答一个他没有问过的问题。这通常是错误的做法,因为它不是来自源XML名称空间,而是HTML名称空间,应该以这种方式处理,或者根本不作为标记,因此是CDATA的一部分。没有迹象表明它不是这里是他的XML中的任何名称空间引用,他正在尝试输出html。他的输入不包括CDATA,因此,如果CDATA包含,那么告诉他应该如何处理似乎没有什么意义。问题是,他的代码可以包含任何html标记,包括格式错误的文本等,不应该像对待源XML那样对待它。请获取我的想法是,它不是关于正式的名称空间,而是关于as结构和as标记的逻辑使用范围。据我所见,您的评论与原始XML的构造更相关。如果它包含CDATA中不存在的未关闭HTML元素,那么它无论如何也不会是格式良好的。如果他的XML格式良好,但恰好是c对于一些HTML元素,没有明确的名称空间,那么仅仅复制它们并不是问题。好问题,+1。请参阅我的答案,了解问题原因的解释和两个完整而简短的解决方案。请注意,当前接受的答案是完全错误的。将标记放入CDATA部分会将其转换为不可用的1-d“不完整的文本,通常被认为是一种不好的做法。@Dimitre Novatchev,除非绝对没有必要将该html视为结构化的,并且它的唯一目的是按原样传递给浏览器,而不会有使用仲裁html标记破坏原始XML结构的风险。让我们先了解一下,然后再对彼此作出判断。”r、 请详细说明“已销毁的标记”,我不明白。@etranger:您可以很容易地找到为什么销毁标记是一种不好的做法--只需搜索。您可以从以下内容开始:,但是您可以很容易地找到许多其他源。这里的代码生成了此输出,我似乎不理解为什么标记被“销毁”本质上:提供的解决方案有效,并且最初被OP标记为有效。我也有我的论点。让我们谈谈并澄清一下。我更喜欢这个答案,因为它更简单,而且不会破坏我的纯文本XSLT。谢谢!@James Walford:您的答案有一个问题:您无法提前知道
    favoriteMovie
    ,因此提供与任何可能的html元素匹配的单独模板是不现实的。如果您确实想避免使用
    xsl:copy of
    ,则需要使用标识规则。我没有提供标识规则的解决方案,因为这与原始问题相差太远。我应该这样做