jjzjj

xml - XSLT 根据计数包装后续的同级元素

coder 2024-06-30 原文

我正在尝试找出一个应该相当简单的 xslt,但却让我有些不快。基本上,我想从以下 xml 开始...

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
    <OBR>
        <OBR-1>obr1</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx2</OBX-1>
    </OBX>
    <OBR>
        <OBR-1>obr2</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx2-1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx2-2</OBX-1>
    </OBX>
    <OBR>
        <OBR-1>obr3</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx3-1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx3-2</OBX-1>
    </OBX>
</TEST>

最后得到以下...

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
    <OBR>
        <OBR-1>obr1</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx2</OBX-1>
    </OBX>
    <SENSITIVITY>
        <OBR>
            <OBR-1>obr2</OBR-1>
        </OBR>
        <OBX>
            <OBX-1>obx2-1</OBX-1>
        </OBX>
        <OBX>
            <OBX-1>obx2-2</OBX-1>
        </OBX> 
        <OBR>
            <OBR-1>obr3</OBR-1>
        </OBR>
        <OBX>
            <OBX-1>obx3-1</OBX-1>
        </OBX>
        <OBX>
            <OBX-1>obx3-2</OBX-1>
        </OBX>
    </SENSITIVITY>
</TEST>

基本上,一旦到达第二个 OBR 元素,它以及任何后续的 OBR 和 OBX 都必须包含在 SENSITIVITY 元素中。初始 xml 中可能包含也可能不包含多个 OBR。

谢谢。

最佳答案

这个简单而简短的转换:

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

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

 <xsl:template match="OBR[2]">
  <SENSITIVITY>
   <xsl:apply-templates select=".|following-sibling::node()" mode="inGroup"/>
  </SENSITIVITY>
 </xsl:template>

 <xsl:template match="node()" mode="inGroup">
  <xsl:call-template name="identity"/>
 </xsl:template>

 <xsl:template match="*[count(preceding-sibling::OBR) >1]"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<TEST>
    <OBR>
        <OBR-1>obr1</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx2</OBX-1>
    </OBX>
    <OBR>
        <OBR-1>obr2</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx2-1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx2-2</OBX-1>
    </OBX>
    <OBR>
        <OBR-1>obr3</OBR-1>
    </OBR>
    <OBX>
        <OBX-1>obx3-1</OBX-1>
    </OBX>
    <OBX>
        <OBX-1>obx3-2</OBX-1>
    </OBX>
</TEST>

产生想要的、正确的结果:

<TEST>
   <OBR>
      <OBR-1>obr1</OBR-1>
   </OBR>
   <OBX>
      <OBX-1>obx1</OBX-1>
   </OBX>
   <OBX>
      <OBX-1>obx2</OBX-1>
   </OBX>
   <SENSITIVITY>
      <OBR>
         <OBR-1>obr2</OBR-1>
      </OBR>
      <OBX>
         <OBX-1>obx2-1</OBX-1>
      </OBX>
      <OBX>
         <OBX-1>obx2-2</OBX-1>
      </OBX>
      <OBR>
         <OBR-1>obr3</OBR-1>
      </OBR>
      <OBX>
         <OBX-1>obx3-1</OBX-1>
      </OBX>
      <OBX>
         <OBX-1>obx3-2</OBX-1>
      </OBX>
   </SENSITIVITY>
</TEST>

解释:

  1. identity rule “按原样”复制每个节点。

  2. 模板覆盖 OBR 的身份规则其父元素的第二个元素 OBR child 。这里我们生成包装器元素 SENSITIVITY并在特殊的 mode 中处理所有后续节点,命名为"inGroup" .

  3. 匹配"ingroup"中任意元素的模板mode 简单地调用身份规则。或者,在这里我们可以简单地使用 <xsl:copy-of select="."/>说明。

  4. 禁止身份模板将第二个 OBR 之后的元素复制到输出(在正常、匿名模式下) ,我们指定了另一个匹配任何此类元素且主体为空的模板规则,这有效地防止了任何此类元素被复制到输出。此模板覆盖并抑制身份规则。

关于xml - XSLT 根据计数包装后续的同级元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7492605/

有关xml - XSLT 根据计数包装后续的同级元素的更多相关文章

  1. 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代码修改为

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  4. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  5. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  6. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  7. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

随机推荐