在同一节点上匹配不同配置的模板

2024-04-27

我问了我的整个问题这里关于堆栈溢出 https://stackoverflow.com/questions/64966059/nesting-xsl-templates-and-referring-multiple-templates-to-the-same-node,我会尝试将其切碎:

我需要从这个源创建一个 xml:非常简单:

    <?xml version="1.0" encoding="UTF-8"?>
    <FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
        <ROW>
        <EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
        <E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
        <E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
        <E1EDT13.1.QUALF><DATA>007<DATA></E1EDT13.1.QUALF>
        <E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
        <E1EDL24.POSNR>000001</E1EDL24.POSNR>
        <E1EDL24.POSNR>2</E1EDL24.POSNR>
                (random number of these)
        <E1EDL41.QUALI>001</E1EDL41.QUALI>
        <E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
        <E1EDL44.POSNR>000001</E1EDL44.POSNR> <!--(these are the line items, equal to the number of ROW)-->
    </ROW>
    <ROW>...

这就是我需要的:

    <DELVRY05>
        <IDOC BEGIN="1">
            <EDI_DC40 SEGMENT="1">
                <TABNAM>EDI-DC40</TABNAM>
            </EDI_DC40>
            <E1EDL20 SEGMENT="1">
                <VBELN>649758</VBELN>
                <E1EDL18 SEGMENT="1"><QUALF>ORI</QUALF></E1EDL18>
                <E1EDT13 SEGMENT="1"><QUALF>007</QUALF></E1EDT13>
                <E1EDT13 SEGMENT="1"><QUALF>015</QUALF></E1EDT13>
                <E1EDL24 SEGMENT="1">
                    <POSNR>000001</POSNR>
                    <E1EDL41 SEGMENT="1">
                        <QUALI>001</QUALI>
                    </E1EDL41>
                </E1EDL24>
                <E1EDL24 SEGMENT="1">
                    <POSNR>2</POSNR>
                    <E1EDL41 SEGMENT="1">
                         <QUALI>001</QUALI>
                    </E1EDL41>
                </E1EDL24>
                <E1EDL24 SEGMENT="1"> <!-- (random number of these, as commented above) -->
                    ...
                </E1EDL24>
            </E1EDL20>
        </IDOC>
    </DELVRY05>

这是我对 xsl 的想法:

    <xsl:template match="/*">
        <DELVRY05>
            <IDOC BEGIN="1">
                <EDI_DC40 SEGMENT="1">
                    <xsl:apply-templates select="headers"/>
                </EDI_DC40>
                <E1EDL20 SEGMENT="1">
                    <xsl:apply-templates select="main"/>
                    <xsl:apply-templates select="fm:ROW"/>
                </E1EDL20>
            </IDOC>
        </DELVRY05>
    </xsl:template>

由于行和标题都包含在 E1EDL20 标记中,因此我认为需要两个模板,并且两者都引用源代码中的相同标记。正如规范所述,仅使用最后一个模板。 (所以它会看到“标题”和“行”,但看不到“主要”:

    <xsl:template name="main" match="fm:ROW[1]"> ...

    <xsl:template name="headers" match="fm:ROW[1]"> ...

    <xsl:template name="lines" match="fm:ROW"> ...

我该如何解决这个问题?

Edit:

@塞巴斯蒂安: 您的解决方案非常适合我最初提供的源代码。很好的答案。然而,我在提供的代码中犯了一个错误,我深表歉意。

这是源代码的格式:

    <?xml version="1.0" encoding="UTF-8"?>
    <FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
        <ROW>
            <EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
            <E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
            <E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
            <E1EDT13.1.QUALF><DATA>007</DATA></E1EDT13.1.QUALF>
            <E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
            <E1EDL24.POSNR>000001</E1EDL24.POSNR>
            <E1EDL41.QUALI>001</E1EDL41.QUALI>
            <E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
            <E1EDL44.POSNR>000001</E1EDL44.POSNR>
        </ROW>
        <ROW>
            <EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
            <E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
            <E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
            <E1EDT13.1.QUALF><DATA>007</DATA></E1EDT13.1.QUALF>
            <E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
            <E1EDL24.POSNR>2</E1EDL24.POSNR>
            <E1EDL41.QUALI>002</E1EDL41.QUALI>
            <E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
            <E1EDL44.POSNR>000001</E1EDL44.POSNR>
        </ROW>
    </FMPDSORESULT>

挑战在于我应该有一个带有标题的标签,但行项目应该在彼此之下列出,如下所示:

    <?xml version="1.0" encoding="utf-16"?>
    <DELVRY05>
      <IDOC BEGIN="1">
        <EDI_DC40 SEGMENT="1">
          <TABNAM>EDI_DC40</TABNAM>
        </EDI_DC40>
        <E1EDL20 SEGMENT="1">
          <VBELN>649758</VBELN>
          <E1EDL18 SEGMENT="1">
            <QUALF>ORI</QUALF>
          </E1EDL18>
          <E1EDL24 SEGMENT="1">
            <POSNR>000001</POSNR>
            <E1EDL41 SEGMENT="1">
              <QUALI>001</QUALI>
            </E1EDL41>
          </E1EDL24>
          <E1EDL24 SEGMENT="1">
            <POSNR>2</POSNR>
            <E1EDL41 SEGMENT="1">
              <QUALI>002</QUALI>
            </E1EDL41>
          </E1EDL24>
        </E1EDL20>
      </IDOC>
    </DELVRY05>

谢谢你对我的包容。我非常感谢你的帮助!

多谢, 汤姆


这是一个入门示例。你的问题缺乏一些细节,有些我假设了一些规则。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fm="http://www.filemaker.com/fmpdsoresult"
    exclude-result-prefixes="fm"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <DELVRY05>
      <xsl:apply-templates select="fm:FMPDSORESULT/fm:ROW[1]"/>
    </DELVRY05>
  </xsl:template>
  
  <xsl:template match="fm:ROW">
    <IDOC BEGIN="1">
      <EDI_DC40 SEGMENT="1">
        <TABNAM><xsl:value-of select="fm:EDI_DC40.TABNAM/fm:DATA"/></TABNAM>
      </EDI_DC40>
      <E1EDL20 SEGMENT="1">
        <VBELN><xsl:value-of select="fm:E1EDL20.VBELN/fm:DATA"/></VBELN>
        <E1EDL18 SEGMENT="1"><QUALF><xsl:value-of select="fm:E1EDL18.QUALF/fm:DATA"/></QUALF></E1EDL18>
        <!-- Same principle as above for E1EDT13.1, E1EDT1.2, etc. -->
        
        <!-- Use template for elements that are present mutltiple times. -->
        <xsl:apply-templates select="../fm:ROW/fm:E1EDL24.POSNR"/>
      </E1EDL20>
    </IDOC>
  </xsl:template>
  
  <xsl:template match="fm:E1EDL24.POSNR">
    <E1EDL24 SEGMENT="1">
      <POSNR><xsl:value-of select="."/></POSNR>
      <E1EDL41 SEGMENT="1">
        <QUALI><xsl:value-of select="../fm:E1EDL41.QUALI"/></QUALI>
      </E1EDL41>
    </E1EDL24>
  </xsl:template>
  
</xsl:stylesheet>

在这里查看它的工作情况:https://xsltfiddle.liberty-development.net/6q1SDka/1 https://xsltfiddle.liberty-development.net/6q1SDka/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在同一节点上匹配不同配置的模板 的相关文章

随机推荐

  • 在 Kohana 3.2 视图中输出图像

    我有以下脚本将图像输出到浏览器 效果很好 file to output SERVER DOCUMENT ROOT static imgs uploads 20110318172207 16 jpg header Content Type i
  • 产生 ENOENT node.js 错误

    我已经使用express generator启动了一个node js应用程序 我有一个奇怪的问题 我无法通过浏览器查看页面两次 第一次加载正常 第二次加载失败 因为节点进程以出现以下错误 GET 304 412ms events js 72
  • 如何使用 Angular JS 处理表单中的多个提交按钮?

    我正在使用 AngularJS 并且有一个用户可以输入数据的表单 在表单的末尾 我想要有两个按钮 一个用于 保存 它将保存并转到另一页 另一个标记为 保存并添加另一个 的按钮将保存表单 然后重置它 允许他们输入另一个条目 我如何以角度实现这
  • 如何验证 SharePoint 用户凭据

    我需要从我的桌面应用程序 用 C 编写 访问共享点应用程序 我应该如何传递凭据并验证身份验证 1 将WebService引用 名称 SourceLists 添加到项目中 Web服务URL https sites vti bin lists
  • 获取当前Windows Phone 7设备的ID

    有没有一种方法可以唯一地识别我的应用程序正在运行的 Windows Phone 设备 有 Windows Phone 设备 ID 之类的吗 Try DeviceExtendedProperties GetValue DeviceUnique
  • Typescript 和 React:使用解构的事件处理程序的正确类型是什么?

    当我在 React 中使用事件处理程序时 我遇到了 Typescript 严格性的问题 具体来说 我无法使用对象解构handleClick 进行的功能onClick handleClick 属性 这是不干净的版本 它是唯一一个打字稿没有抱怨
  • 与 grep 类似地突出显示文本,但不过滤掉文本[重复]

    这个问题在这里已经有答案了 使用 grep 时 它将突出显示与正则表达式匹配的行中的任何文本 如果我想要这种行为 但同时让 grep 打印出所有行怎么办 快速浏览完 grep 手册页后 我发现一无所获 使用确认 看看它的 passthru此
  • 套接字对和一对无名管道有什么区别吗?

    我不仅想知道用户端的差异 还想知道 Linux 内核实现中的差异 共同部分 管道是单向的 因此需要两个管道才能进行双向通信 而套接字对是双向的 管道始终是面向流的 而套接字对可以是面向数据报的 套接字对正常AF UNIX套接字 这意味着辅助
  • Groovy 语言书籍/教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 PHP 中加密的内容与 Ruby 中加密的相同字符串不匹配?

    这是我的要求 我需要使用 AES 加密 包括随机 iv 对 PHP 中的字符串进行加密 对其进行 Base64 编码 然后对其进行 URL 编码 以便可以将其作为 URL 参数传递 我试图在 PHP 和 Ruby 中获得相同的结果 但我无法
  • 我应该使用 Facelets“jsfc”属性吗?

    Facelets 使用jsfc属性将 HTML 元素转换为其关联的JSF成分 这对于快速原型设计非常有帮助 因为它允许您使用可视化设计工具创建视图 然而我最近发现this http weblogs java net blog 2008 12
  • support-library-v7 上的 ClassCastException,使用版本 21

    背景 在过去的两周里 我一直将我的应用程序从 ActionBarSherlock 转移到 Google 的官方支持库 以获得 Material Design 风格 我已经更新到最新版本 21 并且包含了 v4 和 v7 My app htt
  • 是什么让 jQuery 对象在 Chrome 开发工具中显示为数组?

    我想知道 jQuery 对象如何在 Chrome 开发者工具的控制台日志中显示为数组 例如 如果我执行 a 我在控制台日志中看到的是 a a 但以下说法是错误的 var a a Array isArray a false a instanc
  • 实体框架:如何检测数据库的外部更改

    我有一个存储过程可以更改数据库中的大量数据 该存储过程是从同时使用 EF 进行数据操作的应用程序调用的 因此 我单击一个按钮 存储过程在数据库中运行 数据发生更改 并且 EF 向用户显示旧数据 有没有办法强制 DbContext 或 Obj
  • 有条件地使用文件夹大小

    我只想在大小大于特定大小时删除文件夹 不幸的是我无法达到想要的结果stat module Attempt hosts pluto tasks stat path home ik thunderbird register folder nam
  • 无法放弃 git 中的更改

    一两周前 我拿了一些文件 这些文件是我用一个简单的程序存档的find sed tar xz gpgbash 脚本 将它们全部解压 并将它们的内容放入 git 存储库中 提交 将下一个档案内容放入存储库中 提交 冲洗并重复 以便拥有一个更好的
  • 按日期顺序排列的 T-SQL 查询组(间隙和孤岛)

    我有一个这样的示例表 CREATE TABLE Aggregate vKey INT dKey INT StartTrip DATETIME EndTrip DATETIME Distance INT 像这样的一些样本数据 INSERT I
  • 如何解决大内容的角度性能问题

    我熟悉 Angular 的摘要周期以及它如何影响长列表和大模型值的性能 我只是好奇您是否有专门针对我的情况的问题的解决方法 我正在构建一个应用程序 它可能需要也可能不需要用户输入大文本 例如错误日志textarea 但由于与 2 路数据绑定
  • R Studio:更改光标颜色

    我在 R Studio 中使用 Cobalt 编辑器主题 通过更改相应的 cache css 文件对其进行了稍微调整 背景颜色是深色的 我的选择 但文本光标 鼠标指针 也是深色的 因此很难看到 在哪里或如何将鼠标指针颜色更改为例如 cach
  • 在同一节点上匹配不同配置的模板

    我问了我的整个问题这里关于堆栈溢出 https stackoverflow com questions 64966059 nesting xsl templates and referring multiple templates to t