从 XPath 表达式填充 XML 模板文件?

2023-12-11

从 XPath 表达式的映射填充(或生成)XML 模板文件的最佳方法是什么?

要求是我们需要从模板开始(因为这可能包含 XPath 表达式中未捕获的信息)。

例如,起始模板可能是:

<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
    <ns1:create xmlns:ns1='http://predic8.com/wsdl/material/ArticleService/1/'>
      <article xmlns:ns1='http://predic8.com/material/1/'>
        <name>?XXX?</name>
        <description>?XXX?</description>
        <price xmlns:ns1='http://predic8.com/common/1/'>
          <amount>?999.99?</amount>
          <currency xmlns:ns1='http://predic8.com/common/1/'>???</currency>
        </price>
        <id xmlns:ns1='http://predic8.com/material/1/'>???</id>
      </article>
    </ns1:create>
  </s11:Body>
</s11:Envelope>

然后我们就得到了类似的东西:

expression: /create/article[1]/id                => 1
expression: /create/article[1]/description       => bar
expression: /create/article[1]/name[1]           => foo
expression: /create/article[1]/price[1]/amount   => 00.00
expression: /create/article[1]/price[1]/currency => USD
expression: /create/article[2]/id                => 2
expression: /create/article[2]/description       => some name
expression: /create/article[2]/name[1]           => some description
expression: /create/article[2]/price[1]/amount   => 00.01
expression: /create/article[2]/price[1]/currency => USD

然后我们应该生成:

<ns1:create xmlns:ns1='http://predic8.com/wsdl/material/ArticleService/1/'>
    <article xmlns:ns1='http://predic8.com/material/1/'>
        <name xmlns:ns1='http://predic8.com/material/1/'>foo</name>
        <description>bar</description>
        <price xmlns:ns1='http://predic8.com/common/1/'>
            <amount>00.00</amount>
            <currency xmlns:ns1='http://predic8.com/common/1/'>USD</currency>
        </price>
        <id xmlns:ns1='http://predic8.com/material/1/'>1</id>
    </article>
    <article xmlns:ns1='http://predic8.com/material/2/'>
        <name>some name</name>
        <description>some description</description>
        <price xmlns:ns1='http://predic8.com/common/2/'>
            <amount>00.01</amount>
            <currency xmlns:ns1='http://predic8.com/common/2/'>USD</currency>
        </price>
        <id xmlns:ns1='http://predic8.com/material/2/'>2</id>
    </article>
</ns1:create>

我是用 Java 实现的,但如果可能的话,我更喜欢基于 XSLT 的解决方案。

PS:这个问题是另一个问题的反面question我最近问过。


此转换根据“表达式”创建一个具有所需结果结构的 XML 文档 —— 剩下的就是将此结果转换为最终结果:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vPop" as="element()*">
    <item path="/create/article[1]/id">1</item>
    <item path="/create/article[1]/description">bar</item>
    <item path="/create/article[1]/name[1]">foo</item>
    <item path="/create/article[1]/price[1]/amount">00.00</item>
    <item path="/create/article[1]/price[1]/currency">USD</item>
    <item path="/create/article[1]/price[2]/amount">11.11</item>
    <item path="/create/article[1]/price[2]/currency">AUD</item>
    <item path="/create/article[2]/id">2</item>
    <item path="/create/article[2]/description">some name</item>
    <item path="/create/article[2]/name[1]">some description</item>
    <item path="/create/article[2]/price[1]/amount">00.01</item>
    <item path="/create/article[2]/price[1]/currency">USD</item>
 </xsl:variable>

 <xsl:template match="/">
  <xsl:sequence select="my:subTree($vPop/@path/concat(.,'/',string(..)))"/>
 </xsl:template>

 <xsl:function name="my:subTree" as="node()*">
  <xsl:param name="pPaths" as="xs:string*"/>

  <xsl:for-each-group select="$pPaths"
    group-adjacent=
        "substring-before(substring-after(concat(., '/'), '/'), '/')">
    <xsl:if test="current-grouping-key()">
     <xsl:choose>
       <xsl:when test=
          "substring-after(current-group()[1], current-grouping-key())">
         <xsl:element name=
           "{substring-before(concat(current-grouping-key(), '['), '[')}">

          <xsl:sequence select=
            "my:subTree(for $s in current-group()
                         return
                            concat('/',substring-after(substring($s, 2),'/'))
                             )
            "/>
        </xsl:element>
       </xsl:when>
       <xsl:otherwise>
        <xsl:value-of select="current-grouping-key()"/>
       </xsl:otherwise>
     </xsl:choose>
     </xsl:if>
  </xsl:for-each-group>
 </xsl:function>
</xsl:stylesheet>

当此转换应用于任何 XML 文档(未使用)时,结果为:

<create>
   <article>
      <id>1</id>
      <description>bar</description>
      <name>foo</name>
      <price>
         <amount>00.00</amount>
         <currency>USD</currency>
      </price>
      <price>
         <amount>11.11</amount>
         <currency>AUD</currency>
      </price>
   </article>
   <article>
      <id>2</id>
      <description>some name</description>
      <name>some description</name>
      <price>
         <amount>00.01</amount>
         <currency>USD</currency>
      </price>
   </article>
</create>

Note:

  1. 您需要将给定的“表达式”转换为此转换中使用的格式 - 这很简单且直接。

  2. 在最终的转换中,您需要“按原样”复制每个节点(使用恒等规则),但顶部节点应在"http://predic8.com/wsdl/material/ArticleService/1/"命名空间。请注意,“模板”中存在的其他命名空间未使用,可以安全地省略。

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

从 XPath 表达式填充 XML 模板文件? 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 无效的选择器:使用 Selenium 时不允许出现复合类名错误

    我正在尝试通过 Web Whatsapp 打印聊天中的一条消息 我可以通过 控制台 选项卡中的 Javascript 来完成此操作 我就是这样做的 recived msg document getElementsByClassName XE
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • XSLT 将动态 XML 转换为 CSV 并且 XML 节点不完全重复 II

    我正在尝试创建 XSLT 将 XML 转换为 CSV 这里放置了我的 XML 和预期输出 任何人都知道如何获得以下输出 请优先分享我 我的 XML 是

随机推荐

  • 并行使用两个迭代器

    假设我有两个迭代器 并且我想计算 fancyoperation1 iter1 fancyoperation2 iter2 通常 我会简单地使用fancyoperation1 iter1 fancyoperation2 iter2 但是 如果
  • malloc(及其表兄弟)返回的内存块是否初始化为零?

    我写了一个代码来测试对Linux和Windows操作系统的内存管理进行压力测试 为了进一步测试 我继续检查 malloc 返回的内存中存在哪些值 返回的值均为 0 零 我已经阅读了 malloc 的手册页 在 Windows 和 Linux
  • 统一洗牌两个 numpy 数组的更好方法

    我有两个不同形状的 numpy 数组 但长度相同 主维 我想对它们中的每一个进行洗牌 以便相应的元素继续对应 即根据它们的前导索引一致地对它们进行洗牌 这段代码有效 并说明了我的目标 def shuffle in unison a b as
  • 从 A 到 Some(a) 的隐式转换

    出于好奇 我想知道是否可以做类似的事情 def myMethod a Option A None b Option B None z Option Z None Something 我想要的是不必这样称呼它 myMethod b Some
  • 如何使用 .htaccess 从 url 中删除扩展名而不使用尾部斜杠?

    我有一个 htaccess 文件 RewriteEngine On RewriteCond REQUEST FILENAME f RewriteRule 1 php NC L 我有一个名为random php 我只想打电话something
  • 计算多个值的不同行数

    让我们考虑一下这张表 它指定了一个人购买房产的次数 user property john car john car john house peter car peter car amanda house amanda house 我需要知道
  • 在 Mockito 中检测到未完成的存根

    我在运行测试时遇到以下异常 我正在使用 Mockito 进行嘲笑 Mockito 库提到的提示没有帮助 org mockito exceptions misusing UnfinishedStubbingException Unfinish
  • 如何在滚动时更新计时器上的 UITableView

    我的问题很难解释 所以我会尽力解释它 我正在使用 TableView 做一个快速应用程序 在此 TableView 中 我有一些数据存储在本地 字典 数组 var 因此 在我的 TableView 中 我每 0 01 秒刷新一次此数据 然后
  • 如何在 Windows Phone 8.1 中使用 ShareLinkTask 命名空间?

    我正在开发一个应用程序 我正在尝试分享我的应用程序 在 Windows Phone 8 Siverlight 和 Windows Phone 8 1 Silverlight 中 我使用了这些代码 ShareLinkTask shareLin
  • 如何确定位置计数器“.”的基地址。 VMA 和 LMA 何时不同?

    根据ld手册在特殊符号上 即位置计数器 笔记 实际上指的是从开始的字节偏移量 当前包含对象 通常这是 SECTIONS 语句 其起始地址为 0 因此 可以用作绝对地址 如果 然而 它是在部分描述中使用的 它指的是 从该部分开始的字节偏移量
  • JPA 2.0 多对多与额外列 - 更新集合

    我在用下面的例子 Entity public class Employer Id GeneratedValue strategy GenerationType IDENTITY private int id OneToMany mapped
  • R:N维数组的子集化

    考虑以下 3 维数组 set seed 123 arr array sample c 1 10 dim c 3 4 2 这产生 gt arr 1 1 2 3 4 1 10 9 8 2 2 5 1 4 10 3 6 7 3 5 2 1 2 3
  • 使用白名单对用户输入进行清理

    我有这段代码可以清理名为 用户名 的变量上的用户输入 username clean preg replace a zA Z0 9 POST username if strlen username clean die username is
  • 如何在使用gunicorn 的Google App Engine 上运行长任务?

    GAE flex默认使用gunicorn作为入口点 这很好 除了我有一个需要很长时间来处理的函数 在数据库中抓取网站和故事数据 并且gunicorn默认在30秒超时 然后一个新的worker从头开始执行任务 等等 我可以将gunicorn超
  • org.h2.jdbc.JdbcSQLException:找不到表

    我收到这个异常 org h2 jdbc JdbcSQLException Table CUSTOMERS not found SQL statement SELECT FROM CUSTOMERS 这是 H2 控制台 我在那里创建了一个表
  • 替换数据框列表中的值

    我有一个数据框列表 每个列都有一个 ID 列 后跟许多数字列 带有列名称 我想将所有数字列的所有 1 替换为 0 但保持 ID 列相同 我可以使用单个数据框来部分完成此操作 df 1 lt 0 但是当我尝试将其嵌入到 lapply 中时 它
  • 有没有 ios-ntp 的替代方案来获取原子/当前时间 ios?

    在我的应用程序中 我想获得准确的日期和时间 基本上 在我的应用程序中 会有一个时间敏感部分 用户只有在特定时间之后才能启动 但是 如果我从设备中获取日期和时间 用户可以轻松更改设备上的日期和时间 Settings gt General gt
  • 在 jar 中加载文件

    我需要将配置文件打包到 jar 中 配置文件位于 jar 文件的根目录下 但是我收到以下错误 引起原因 java lang IllegalArgumentException URI 不是分层的 在 java io File 来源未知 Fil
  • python:将 1/0 列表转换为布尔值列表

    尝试将 1 0 列表转换为布尔值列表 bool 1 0 1 0 似乎不起作用 1 0 1 0 1不起作用 还有另一种方法 希望是非列表理解 吗 在Python 2中 bool list map bool int list 在Python 3
  • 从 XPath 表达式填充 XML 模板文件?

    从 XPath 表达式的映射填充 或生成 XML 模板文件的最佳方法是什么 要求是我们需要从模板开始 因为这可能包含 XPath 表达式中未捕获的信息 例如 起始模板可能是