jjzjj

xml - 我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点中?

coder 2024-06-28 原文

我正在尝试将基于 Flash 的文本格式转换为基于 HTML 的文本。

<LI></LI>源 xml 中的 block 我需要添加相邻的 <LI> <ul> 内的 block block 。

<p></p>
<li></li> ------
<li></li>      | - should be wrapped with <ul> tag
<li></li> ------
<p></p>
<li></li>
<li></li>
<li></li>
<p></p>

XML 源代码

<root>
    <TEXTFORMAT LEADING="2">
        <P ALIGN="LEFT">
            edfg
        </P>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <P ALIGN="LEFT">
            sdgfdsgsds
        </P>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <LI>
            sdfgdsg
        </LI>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <LI>
            dsgdfgdsfg
        </LI>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <LI>
            <FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">errytrtyr</FONT>
        </LI>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <P ALIGN="LEFT">
            sdgfdsgsds
        </P>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <LI>
            <FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">nm,hjku
                <FONT FACE="Lato" SIZE="12"></FONT>
            </FONT>
        </LI>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <LI>
            <FONT FACE="System" SIZE="16" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">
                <B>hgjgj</B>
                <FONT FACE="Lato" SIZE="12"></FONT>
            </FONT>
        </LI>
    </TEXTFORMAT>
    <TEXTFORMAT LEADING="2">
        <P ALIGN="CENTER">
            <FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B" LETTERSPACING="0" KERNING="0">centered text</FONT>
        </P>
    </TEXTFORMAT>
</root>

预期输出

<div>
    <div style="text-align:LEFT; ">
        edfg
    </div>
    <div style="text-align:LEFT; ">
        sdgfdsgsds
    </div>
    <ul>
        <li>
            sdfgdsg
        </li>
        <li>
            dsgdfgdsfg
        </li>
        <li>
            <FONT COLOR="#4B4B4B" FACE="Lato" SIZE="12">errytrtyr</FONT>
        </li>
    </ul>
    <div style="text-align:LEFT; ">
        sdgfdsgsds
    </div>
    <ul>
        <li>
            <FONT COLOR="#4B4B4B" FACE="System" SIZE="16">nm,hjku
                <FONT FACE="Lato" SIZE="12"></FONT>
            </FONT>
        </li>
        <li>
            <FONT COLOR="#4B4B4B" FACE="System" SIZE="16">
                <B>hgjgj</B>
                <FONT FACE="Lato" SIZE="12"></FONT>
            </FONT>
        </li>
    </ul>
    <div style="text-align:CENTER; ">
        <FONT COLOR="#4B4B4B" FACE="Lato" SIZE="12">centered text</FONT>
    </div>
</div>

我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes" method="html"/>

    <!-- identity template -->

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="root">
        <div>
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <!-- remove unwanted attributes -->
    <xsl:template match="@LETTERSPACING|@KERNING"/>

    <!-- Remove <P> tag and set the alignment -->
    <xsl:template match="P">
        <div>
            <xsl:attribute name="style">
                <!-- collect attributes -->
                <xsl:variable name="styles">
                    <xsl:if test="@ALIGN">
                        <xsl:value-of select="concat('text-align:', @ALIGN )"/>
                        <xsl:text>; </xsl:text>
                    </xsl:if>
                </xsl:variable>
                <!-- delete trailing spaces -->
                <xsl:value-of select="$styles"/>
            </xsl:attribute>
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <!-- Replace <LI> with <li> -->
    <xsl:template match="LI">
        <li><xsl:apply-templates/></li>
    </xsl:template>

    <!-- Remove TEXTFORMAT -->
    <xsl:template match="TEXTFORMAT">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

最佳答案

以下 XSLT 1.0 转换为您提供了似乎想要的结果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes" method="html"/>

    <xsl:key name="list" match="TEXTFORMAT[LI]" use="generate-id(
        (self::*|preceding-sibling::*)[LI][
            not(preceding-sibling::*[1][LI])
        ][last()]
    )" />

    <!-- identity template -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="root">
        <div>
            <xsl:apply-templates />
        </div>
    </xsl:template>

    <!-- Remove <P> tag and set the alignment -->
    <xsl:template match="P">
        <div>
            <xsl:attribute name="style">
                <xsl:apply-templates select="@*" mode="css" />
            </xsl:attribute>
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match="@ALIGN" mode="css">
        <xsl:value-of select="concat('text-align:', ., ';')"/>
    </xsl:template>
    <!-- add more -->
    <xsl:template match="@*" mode="css" />

    <!-- remove unwanted attributes -->
    <xsl:template match="@LETTERSPACING|@KERNING"/>

    <xsl:template match="TEXTFORMAT[LI]">
        <xsl:variable name="adjacent" select="key('list', generate-id())" />
        <xsl:if test="$adjacent">
            <ul>
                <xsl:apply-templates select="$adjacent/LI" />
            </ul>
        </xsl:if>
    </xsl:template>

    <!-- Replace <LI> with <li> -->
    <xsl:template match="LI">
        <li><xsl:apply-templates/></li>
    </xsl:template>

    <!-- Remove TEXTFORMAT -->
    <xsl:template match="TEXTFORMAT">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

结果:

<div>
   <div style="text-align:LEFT;">
      edfg

   </div>
   <div style="text-align:LEFT;">
      sdgfdsgsds

   </div>
   <ul>
      <li>
         sdfgdsg

      </li>
      <li>
         dsgdfgdsfg

      </li>
      <li><FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B">errytrtyr</FONT></li>
   </ul>
   <div style="text-align:LEFT;">
      sdgfdsgsds

   </div>
   <ul>
      <li><FONT FACE="System" SIZE="16" COLOR="#4B4B4B">nm,hjku
            <FONT FACE="Lato" SIZE="12"></FONT></FONT></li>
      <li><FONT FACE="System" SIZE="16" COLOR="#4B4B4B"><B>hgjgj</B><FONT FACE="Lato" SIZE="12"></FONT></FONT></li>
   </ul>
   <div style="text-align:CENTER;"><FONT FACE="Lato" SIZE="12" COLOR="#4B4B4B">centered text</FONT></div>
</div>

从字面上看,解决方案的关键是这种结构:

<xsl:key name="list" match="TEXTFORMAT[LI]" use="generate-id(
    (self::*|preceding-sibling::*)[LI][
        not(preceding-sibling::*[1][LI])
    ][last()]
)" />

这索引每个 TEXTFORMAT[LI]在文档中最近的唯一 ID TEXTFORMAT[LI]开始当前系列,即最近的没有 TEXTFORMAT[LI] 的系列在此之前。

从那里我们可以决定 <xsl:template match="TEXTFORMAT[LI]">是否为任何给定的 TEXTFORMAT[LI] 输出一些东西.

关于xml - 我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39139742/

有关xml - 我们如何识别一组节点并将该组添加到另一个 XSLT 中 XML 源结构不同的节点中?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  6. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  7. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  8. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  9. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  10. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

随机推荐