根据特定文本拆分 XML 节点

2024-01-24

请建议如何根据特定注释文本拆分 xml 节点 ()。我尝试使用xsl:文本禁用输出转义格式以放置所需的结束和开始标记(元素)。

  • 我的代码是静态的,如何制作动态代码,该代码适用于注释文本方面的任意数量的祖先,即,如果祖先计数'n',然后从n to 1如何使用调用模板方法。
  • 出现一些空节点,它们不是内容的祖先,如何避免这些

我参考了我们网站上的一些建议,但发现很难理解其中的逻辑。请建议。 (XSLT 2 版本)

XSLT:

<root>
    <a>
        <b>The text1
            <c>
                <d>The text2</d><d>The text3</d><!--Break--><d>The text4</d>
                <e>The text5<!--Break--></e>
            </c>
            <f>The text6</f>
        </b>
    </a>
</root>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:template match="@*|node()">
     <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
   </xsl:template>

   <xsl:template match="//comment()[contains(., 'Break')]">
       <xsl:variable name="varAncestorCount" select="count(ancestor::*)"/>
       <xsl:choose>
           <xsl:when test="$varAncestorCount = 4">
               <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                   <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                       <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                           <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                               <xsl:comment><xsl:value-of select="."/></xsl:comment>
                           <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>    
                       <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                   <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
               <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
           </xsl:when>
           <xsl:when test="$varAncestorCount = 5">
               <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                   <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                       <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                           <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                               <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="ancestor::*[5]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                                   <xsl:comment><xsl:value-of select="."/></xsl:comment>
                               <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[5]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>    
                           <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>    
                       <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
                   <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
               <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">&gt;</xsl:text>
           </xsl:when>
       </xsl:choose>

   </xsl:template>

 </xsl:stylesheet>

期望的输出:

<root>
    <a>
        <b>The text1
            <c>
                <d>The text2</d>
                <d>The text3</d>
            </c>
        </b>
    </a>
</root>
<!--Break-->
<root>
    <a>
        <b>
            <c>
                <d>The text4</d>
                <e>The text5</e>
            </c>
        </b>
    </a>
</root>
<!--Break-->
<root>
    <a>
        <b>
            <f>The text6</f>
        </b>
    </a>
</root>

[呻吟]你在哪里找到这些“有趣”的任务?

您永远不需要使用转义文本手动形成 XML 节点。

尝试以下样式表。它可能会更加精简,但我相信它解决了这里的主要问题:

XSLT 2.0

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

<xsl:variable name="root" select="/*" />

<xsl:template match="/">
    <super-root>
        <xsl:for-each select="0 to count(//comment()[.='Break'])">
            <xsl:apply-templates select="$root">
                <xsl:with-param name="i" select="." tunnel="yes"/>
            </xsl:apply-templates>
            <xsl:if test="position()!=last()">
                <xsl:comment>Break</xsl:comment>
            </xsl:if>
        </xsl:for-each >
    </super-root>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:param name="i" tunnel="yes"/>
        <xsl:if test="descendant-or-self::text()[count(preceding::comment()[.='Break'])=$i]">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

Result:

<?xml version="1.0" encoding="UTF-8"?>
<super-root>
   <root>
      <a>
         <b>The text1
            <c>
               <d>The text2</d>
               <d>The text3</d>
            </c>
         </b>
      </a>
   </root>
   <!--Break-->
   <root>
      <a>
         <b>
            <c>
               <d>The text4</d>
               <e>The text5</e>
            </c>
         </b>
      </a>
   </root>
   <!--Break-->
   <root>
      <a>
         <b>
            <f>The text6</f>
         </b>
      </a>
   </root>
</super-root>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据特定文本拆分 XML 节点 的相关文章

随机推荐

  • 链接到 Flask 模板中的特定位置

    在 HTML 中 假设存在具有给定 id 的元素 我可以直接链接到页面上的特定位置 a href http www example com stuff html exactlocation Go there a 在 Flask 中我尝试将锚
  • 在包含控制器和 ApiController 的项目中,从 ApiController 和操作名称获取 Url

    现有项目的控制器继承自 Controller RouteTable Routes MapRoute with controller action id ApiController GlobalConfiguration Configure并
  • 如何重命名 GitHub 上的存储库?

    我想重命名 GitHub 上的一个存储库 但当出现一个大红色警告时 我感到害怕 我们不会从旧位置设置任何重定向 您将需要更新本地存储库以指向新位置 重命名可能需要几分钟才能完成 有谁有关于如何手动完成 1 和 2 的分步说明吗 或者我必须在
  • JPA Criteria API - 子类上带有字段的条件

    我有一个名为Issue和实体称为UserIssue UserIssue延伸Issue Inheritance strategy InheritanceType JOINED Entity name ISSUE public class Is
  • CMake 中的版本正则表达式

    我想验证用户指定的版本字符串 确保它由三个句点分隔的数字组成 e g 1 20 300 但我不知道如何编写这样的正则表达式 下面的代码只是一个尝试 if PROJECT VERSION MATCHES 0 9 0 9 0 9 message
  • 为什么 [[[!![]+[]]+[]]+[]][+[]][+[]] 的计算结果为 t? [复制]

    这个问题在这里已经有答案了 我发现在 JavaScript 中 评估为 t 这怎么可能 我确实知道 评估为true 但是如何从中获得 t 呢 console log None
  • mysql date_sub 使用字段作为间隔

    我需要 mysql 和 date sub 方面的帮助 我有一个表调用活动 Activity id deadline alert Activity 1 2011 04 18 1 DAY Activity 2 2011 04 13 1 MONT
  • 将 Unicode 文本放置到具有 NULL 所有者窗口的剪贴板上时出现意外行为

    我正在尝试将文本从我正在处理的 Windows 桌面应用程序中放置到剪贴板上 但我遇到了一些我不理解的行为 我正在使用的功能如下 bool Clipboard CopyText const XStringW txt size t memsi
  • 流畅地调用await而不使用括号

    有没有办法重构这条线 var result await Foo Bar 这样它就不会使用括号 也不会将等待结果分配给临时变量 我正在尝试构建一个支持长时间操作的流畅框架 当您需要将 wait 括在括号中时 现实世界的代码会变得非常丑陋 va
  • Python 3 - 从整数转换为“字节”然后连接它们(用于串行传输)

    经过多次毫无结果的搜索 我在理解 Python 3 2 中处理 字节 和十六进制内容的方式时遇到了一个非常具体的问题 我知道我误解了 但似乎无法找到正确的路径 我的最终目标是使用python串行模块来传输字节序列 有些字节是静态的 不会改变
  • 使用 ffmpeg 将视频从 .264 转换为 .265 (HEVC)

    我看到关于这个主题的一些问题 但我仍然收到错误 我想要做的就是将库中的视频转换为 HEVC 以便它们占用更少的空间 我试过这个 ffmpeg i input mp4 c v libx265 output mp4 ffmpeg 似乎需要很长时
  • iOS4进入后台播放音频

    当谈论在后台播放音频时 文档写得相当糟糕 它给人的印象是 要继续播放当前正在播放的音频 您只需将键 值对添加到info plist文件和wallah 这很神奇 然而 这种情况并非如此 例如 如果我播放 2 分钟长的 mp3 显然音频足够长
  • NSCalendar 日差错误

    我正在尝试使用 NSCalendar currentCalendar ordinalityOfUnit NSDayCalendarUnit inUnit NSEraCalendarUnit forDate date 在两个不同的日期查看它们
  • 在 Apache JMeter 中配置响应超时

    我试图检查特定 HTTP 请求的响应时间是否超过 30 秒 如果是 则将其标记为失败并停止线程 有时我可以看到响应时间接近 80 秒 没有浏览器等待服务器响应那么长时间 我发现了以下三种在 JMeter 中设置超时值的方法 但这让我很困惑
  • 每当 gem 时,schedule.rb 中的配置文件与 Rails 一起使用?

    我的 Rails 应用程序的 config 文件夹中有一个名为 config yml 的文件 我还有一个初始化程序 config initializers load config rb 其中包含以下代码 APP CONFIG YAML lo
  • 如何在 Swift 中实现 didReceiveMemoryWarning?

    每当我创建一个新的 View Controller 子类时 Xcode 都会自动添加该方法 override func didReceiveMemoryWarning super didReceiveMemoryWarning Dispos
  • 如何像在 Firefox 的 Firebug 中一样在 Chrome 中编辑 CSS?

    我一直在 Firefox 中使用 Firebug 编辑 CSS 但最近注意到 Chrome 渲染我的页面的速度要快得多 带有滚动 交互元素等 因此想切换到它 我发现 Chrome 显示了计算出的 CSS 以及堆栈中哪些属性被否决 我可以一一
  • 如何使用空间掩模限制光栅处理范围?

    我试图将 MATLAB 中的栅格处理限制为仅包含 shapefile 边界内的区域 类似于 ArcGIS Spatial Analyst 函数使用mask http resources arcgis com en help main 10
  • 在 scikit-learn 中使用 ExtraTreesClassifier 时出错

    我正在尝试在 scikit learn 中对我的数据使用 ExtraTreesClassifier 我有两个 numpy 数组 X 和 y X 的尺寸为 10000 51 y 的尺寸为 10000 为了确保它们采用 numpy 数组格式 我
  • 根据特定文本拆分 XML 节点

    请建议如何根据特定注释文本拆分 xml 节点 我尝试使用xsl 文本禁用输出转义格式以放置所需的结束和开始标记 元素 我的代码是静态的 如何制作动态代码 该代码适用于注释文本方面的任意数量的祖先 即 如果祖先计数 n 然后从n to 1如何