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
使用XSL测试节点是否包含转义XML?_Xml_Xslt_Escaping_Libxml2_Libxslt - Fatal编程技术网

使用XSL测试节点是否包含转义XML?

使用XSL测试节点是否包含转义XML?,xml,xslt,escaping,libxml2,libxslt,Xml,Xslt,Escaping,Libxml2,Libxslt,我正在尝试清理一批提供给我的XML。我需要考虑三种情况: 一些元素中有纯文本,例如一些文本,需要用另一个标记包装,例如一些文本 一些元素在其中转义了XML,例如,p>一些文本/p>,需要在不转义的情况下输出:一些文本 一些元素转义了需要包装的XML,例如,some em>text/em>需要变成some text 在这两种情况下都用作容器 我可以相对容易地满足条件1,我可以用禁用输出转义来满足条件2,但用这种方法无法满足条件3 如果我可以测试中的文本是否转义,但是使用的测试包含(,“<;”)

我正在尝试清理一批提供给我的XML。我需要考虑三种情况:

  • 一些元素中有纯文本,例如
    一些文本
    ,需要用另一个标记包装,例如
    一些文本

  • 一些元素在其中转义了XML,例如,
    p>一些文本/p>
    ,需要在不转义的情况下输出:
    一些文本

  • 一些元素转义了需要包装的XML,例如,
    some em>text/em>
    需要变成
    some text

  • 在这两种情况下都用作容器

    我可以相对容易地满足条件1,我可以用
    禁用输出转义来满足条件2,但用这种方法无法满足条件3

    如果我可以测试
    中的文本是否转义,但是使用
    的测试包含(,“<;”)
    不匹配,我认为我可以满足2(可能是3)。所以

    如何测试节点中的文本是否为转义XML

  • 三,。都需要包装并在1中禁用输出转义。不会受伤,所以我想你可以用同样的模板来处理它们
  • 我看不到元素内容是否包含带有纯XSLT1.0含义的转义元素标记的明确检查,所以我只是尝试了一下

    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/root">
      <html>
        <body>
          <xsl:apply-templates/>
        </body>
      </html>
    </xsl:template>
    
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="item[not(*) and not(starts-with(., '&lt;') and substring(., string-length(.)) = '&gt;')]">
      <xsl:copy>
        <p>
          <xsl:value-of select="." disable-output-escaping="yes"/>
        </p>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="item[not(*)
                              and starts-with(., '&lt;') and substring(., string-length(.)) = '&gt;']">
      <xsl:copy>
        <xsl:value-of select="." disable-output-escaping="yes"/>
      </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    

    哪种转变

    <root>
    <item>some text</item>
    <item>&lt;p>some text&lt;/p></item>
    <item>some &lt;em>text&lt;/em></item>
    </root>
    
    
    一些文本
    p> 一些文本/p>
    一些em>text/em>
    
    进入

    
    一些文本

    一些文本

    一些文本


    显然,它会将
    ..>
    转换为
    。您可以尝试实现更多的字符串检查,但如果没有转义XML片段的完整解析器,则始终可以在字符串检查失败的情况下构造输入示例。

    包含(,,“”)
    可以工作?您到底使用哪种XSLT 1.0处理器?您是否检查了扩展函数是否可用或是否可以轻松实现,该扩展函数将
    元素的内容解析为树片段,然后根据需要使用普通模板进行处理?@MaxToro否,因为这本质上是在搜索
    @MartinHonnen使用相关信息更新标记,但实际上我使用的是
    libxml2
    libxslt
    。谢谢Martin。我得出了同样的结论,我需要解析转义内容以确保其格式正确,因此我将向我正在使用的语言(Python+lxml)添加一个回调来处理这个问题。
    <html><body>
    <item><p>some text</p></item>
    <item><p>some text</p></item>
    <item><p>some <em>text</em></p></item>
    </body></html>