从 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 模板文件? 的相关文章

  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • CSS 和 XPath 选择器有什么区别?就跨浏览器测试的性能而言,哪个更好?

    我正在与硒网络驱动程序 https en wikipedia org wiki Selenium software Selenium WebDriver2 25 0 在多语言 Web 应用程序上 主要测试页面内容 针对不同语言 如阿拉伯语
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • 在 Word 2010 中开发功能区选项卡,在组标签名称中使用 & 符号

    我正在开发一个用于模板的功能区选项卡 MyTemplate dotm 对于 Word 2010 我的问题 我想在组的标签中使用与号 我尝试了很多方法 也用谷歌搜索了很多关于这个问题的信息 但没有任何效果 named amp decimal
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和

随机推荐

  • 并行使用两个迭代器

    假设我有两个迭代器 并且我想计算 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 表达式中未捕获的信息 例如 起始模板可能是