XSLT根据父子元素的值删除子元素

2023-12-03

我正在尝试使用这里使用的一些相同的逻辑https://stackoverflow.com/a/10629806/662877

到不同的 XML 但没有得到预期的输出。

如果 //TERR="KHM6" 则删除/剥离这两个元素创建付款项目 and 创建支付扩展从输入生成输出。 有人可以告诉我我在这里缺少什么吗?

Thanks

XSLT:

<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()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match=
 "*[../TERR='KHM6']/CreatePaymentItems | *[../TERR='KHM6']/CreatePayExt"/>
</xsl:stylesheet>

输入 XML 示例:

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
  <TransactionType>
    <PayLineItems>
      <PayLineInsert>
        <PAYTYPE>4</PAYTYPE>
        <NUMBER>R2293416</NUMBER>
        <SERIAL>3335889530</SERIAL>
        <DOCDATE>05/03/2012</DOCDATE>
        <ITEMNMBR>4NZ3330000010</ITEMNMBR>
        <UNITPRCE>599.99</UNITPRCE>
        <XTNDPRCE>599.99</XTNDPRCE>
        <QUANTITY>1</QUANTITY>
        <TAXAMNT>43.65</TAXAMNT>
        <QTYONHND>1</QTYONHND>
        <TERR>KHM6</TERR>
      </PayLineInsert>
    </PayLineItems>
    <PayLineEXT>
      <PAYTYPE>4</PAYTYPE>
      <NUMBER>R2293416</NUMBER>
      <LNITMSEQ>2293416</LNITMSEQ>
    </PayLineEXT>
    <CreatePaymentItems>
      <CreatePaymentInsertRecord>
        <INTERID>TOTM</INTERID>
        <PAYTYPE>4</PAYTYPE>
        <PAYNUMBER>R2293416</PAYNUMBER>
        <DOCDATE>05/03/2012</DOCDATE>
        <DOCAMOUNT>645.03</DOCAMOUNT>
        <DOCNUMBER>2293416</DOCNUMBER>
      </CreatePaymentInsertRecord>
    </CreatePaymentItems>
    <CreatePayExt>
      <PAYTYPE>4</PAYTYPE>
      <PAYNUMBER>R2293416</PAYNUMBER>
      <SEQNUMBR>61261585</SEQNUMBR>
    </CreatePayExt>
  </TransactionType>
</ns0:DocTran>

预期输出 XML:

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
  <TransactionType>
    <PayLineItems>
      <PayLineInsert>
        <PAYTYPE>4</PAYTYPE>
        <NUMBER>R2293416</NUMBER>
        <SERIAL>3335889530</SERIAL>
        <DOCDATE>05/03/2012</DOCDATE>
        <ITEMNMBR>4NZ3330000010</ITEMNMBR>
        <UNITPRCE>599.99</UNITPRCE>
        <XTNDPRCE>599.99</XTNDPRCE>
        <QUANTITY>1</QUANTITY>
        <TAXAMNT>43.65</TAXAMNT>
        <QTYONHND>1</QTYONHND>
        <TERR>KHM6</TERR>
      </PayLineInsert>
    </PayLineItems>
    <PayLineEXT>
      <PAYTYPE>4</PAYTYPE>
      <NUMBER>R2293416</NUMBER>
      <LNITMSEQ>2293416</LNITMSEQ>
    </PayLineEXT>
  </TransactionType>
</ns0:DocTran>

问题就在这里:

*[../TERR='KHM6']/CreatePaymentItems

这匹配CreatePaymentItems具有同级元素的子元素TERR有价值"KHM6".

但所有的兄弟姐妹TERR所提供的 XML 文档中没有子项。

这就是你想要的转变:

<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()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "*[PayLineItems/*/TERR = 'KHM6']
      /*[self::CreatePaymentItems or self::CreatePayExt]"/>
</xsl:stylesheet>

当应用于提供的 XML 文档时(已更正为格式良好):

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
    <TransactionType>
        <PayLineItems>
            <PayLineInsert>
                <PAYTYPE>4</PAYTYPE>
                <NUMBER>R2293416</NUMBER>
                <SERIAL>3335889530</SERIAL>
                <DOCDATE>05/03/2012</DOCDATE>
                <ITEMNMBR>4NZ3330000010</ITEMNMBR>
                <UNITPRCE>599.99</UNITPRCE>
                <XTNDPRCE>599.99</XTNDPRCE>
                <QUANTITY>1</QUANTITY>
                <TAXAMNT>43.65</TAXAMNT>
                <QTYONHND>1</QTYONHND>
                <TERR>KHM6</TERR>
            </PayLineInsert>
        </PayLineItems>
        <PayLineEXT>
            <PAYTYPE>4</PAYTYPE>
            <NUMBER>R2293416</NUMBER>
            <LNITMSEQ>2293416</LNITMSEQ>
        </PayLineEXT>
        <CreatePaymentItems>
            <CreatePaymentInsertRecord>
                <INTERID>TOTM</INTERID>
                <PAYTYPE>4</PAYTYPE>
                <PAYNUMBER>R2293416</PAYNUMBER>
                <DOCDATE>05/03/2012</DOCDATE>
                <DOCAMOUNT>645.03</DOCAMOUNT>
                <DOCNUMBER>2293416</DOCNUMBER>
            </CreatePaymentInsertRecord>
        </CreatePaymentItems>
        <CreatePayExt>
            <PAYTYPE>4</PAYTYPE>
            <PAYNUMBER>R2293416</PAYNUMBER>
            <SEQNUMBR>61261585</SEQNUMBR>
        </CreatePayExt>
    </TransactionType>
</ns0:DocTran>

产生了想要的正确结果:

<ns0:DocTran xmlns:ns0="http://test.Schemas.Out_Return" doctype="Return">
   <TransactionType>
      <PayLineItems>
         <PayLineInsert>
            <PAYTYPE>4</PAYTYPE>
            <NUMBER>R2293416</NUMBER>
            <SERIAL>3335889530</SERIAL>
            <DOCDATE>05/03/2012</DOCDATE>
            <ITEMNMBR>4NZ3330000010</ITEMNMBR>
            <UNITPRCE>599.99</UNITPRCE>
            <XTNDPRCE>599.99</XTNDPRCE>
            <QUANTITY>1</QUANTITY>
            <TAXAMNT>43.65</TAXAMNT>
            <QTYONHND>1</QTYONHND>
            <TERR>KHM6</TERR>
         </PayLineInsert>
      </PayLineItems>
      <PayLineEXT>
         <PAYTYPE>4</PAYTYPE>
         <NUMBER>R2293416</NUMBER>
         <LNITMSEQ>2293416</LNITMSEQ>
      </PayLineEXT>
   </TransactionType>
</ns0:DocTran>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSLT根据父子元素的值删除子元素 的相关文章

  • CSS,悬停一个元素,影响另一个元素

    当我将鼠标悬停在 li a 上时 我可以影响普通 CSS 中的另一个元素吗 因为我试图在悬停链接时将一个框作为背景元素滑入 与此网站导航完全相同 只是不是在激活时使用 而是通过悬停来使用 http www zindhai com http
  • XSD 到 XForms 以及 XForms 到 XSD 转换

    目前我正在努力解决两个问题 我从外部服务器接收到一个 XSD 文件 并且基于该文件我必须生成 XForm 通常 XSD 文件会导入许多其他 XSD 文件等等 我正在使用 XForm 构建器编写 GUI 当用户构建他的自定义 XForm 时
  • 我可以为 XPath 中缺失的标签创建一个值吗?

    我有一个使用 XPath 从 XML 文件中提取数据的应用程序 如果该 XML 源文件中的节点丢失 我想返回值 N A 很像 Oracle NVL 函数 问题在于该应用程序不支持 XSLT 我想使用 XPath 和单独使用 XPath 来完
  • 对其他元素值的 XSD 限制

    是否可以在 XSD 文档中对其他元素值进行限制 例如 我有国家和州元素 如果国家 地区等于美国 那么我需要限制指定枚举的状态元素值 否则状态可以只是固定长度的字符串 当前 XSD 的示例 始终将状态限制为枚举
  • HTML 到 CALS 表?

    我正在检查是否有人拥有可将 HTML 表转换为 CALS 的 XSLT 我发现了很多关于采用其他方式 CALS 到 HTML 的材料 但没有找到来自 HTML 的材料 我认为以前可能有人这样做过 所以我不必重新发明轮子 我并不是在寻找完整的
  • 如果子节点为空,则删除父节点

    源 XML
  • 使用xsl获取文件名

    如何使用 xsl 1 0 获取文件名 I tried
  • 由于命名空间“xmlns”,无法使用 XSLT 转换 XML

    我一直在尝试使用 XSLT 转换 XML 文件 但由于一些问题 即 xmlns 它没有转换 我 一辈子都找不到问题所在 XML 文件
  • 使用 XSLT(即 XML Transformer)时防止 DTD 下载

    我必须在 Java 中处理具有 DTD 和 XSLT 的 XML 文件 DTD 确实是必要的 因为它包含我使用的实体的定义 旁白 是的 将实体用于可以使用 unicode 的东西是一个坏主意 当我运行转换时 它每次都会从外部源下载 DTD
  • XSL:让原始 HTML 通过

    我正在进行 XSL 转换 我正在转换的 XML 有一个包含 html 的节点
  • XSLT,查找最后一个子节点是否是特定元素

    看下面两个例子
  • XSLT 分组/合并子项(使用密钥)

    我试图了解如何使用我已经编写的代码推导出解决方案 为了简化起见 我将首先解释我想要做什么以及到目前为止我得到了什么 假设我在 XSLT 中有一个 XML 变量 其中包含几个具有相同标题属性的节点 Using Dimitre Novatche
  • 使用 XSLT 从文本文件中删除第一行

    我正在使用一个生成文本文件的系统 Maximo 我需要删除文件的第一行 做到这一点的方法应该是使用 XSLT 任何想法 是的 您可以在 XSLT 中完成您想要的事情 如果您可以选择的话 在 XSLT 2 0 中这样做可能会更容易 Micha
  • 日期减去 xslt 中的另一个日期

    希望有人能帮忙 我正在尝试比较 XML 文件中的 2 个日期并使用 XSLT 进行一些计算 例如 我有 2 个 XML 日期 2011 05 23 和 2011 04 29 我想在 XSLT 中进行计算 如下所示 2011 05 23 20
  • Xslt 到 xsl-fo 转换

    我想将 xslt 转换为 xsl fo 但我不太确定我能做到这一点 我尝试将 XML 列表转换为 xsl fo 列表 谁能告诉我在哪里可以找到我在谷歌上搜索了很长时间没有很多这样的例子 我的XML是这样的 p TEXT p ul li It
  • XSLT key() 查找

    我正在尝试 XSLT 中的查找表示例 但无法使其工作
  • 如何使用 XSLT 从平面 XML 列表构建树?

    我使用极简 MVC 框架 其中PHP控制器手上的DOM模型 to the XSLT 视图 c f okapi http okapi liip ch 为了构建导航树 我在 MYSQL 中使用了嵌套集 这样 我最终得到一个如下所示的模型 XML
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • 有人可以推荐一个免费的 xslt 工具吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 根据属性值使用 xslt 合并两个元素

    这是我的源文件的样子

随机推荐

  • 调用结果未使用

    在第二条评论的正下方 我收到一条错误 调用 taskForDeleteMethod 的结果未使用 为什么当我在调用后的闭包中使用结果和错误时会出现这种情况 func deleteSession completionHandlerForDel
  • Java 重写私有函数不显示多态行为

    public class Shape final private void print System out println in class Shape public static void main String args Shape
  • 如何知道 onCreateView 函数中哪个选项卡处于活动状态?

    我如何知道我的哪个选项卡处于活动状态 public View onCreateView LayoutInflater inflater ViewGroup容器 Bundle savingInstanceState 函数 以下代码仅适用于首次
  • 调用 SwingWorker.get( ) 时防止 GUI 冻结

    我有一个程序 我正在加载文件 同时显示一个窗口以通知用户正在加载文件 我决定创建一个 FileLoader 类 它是一个 SwingWorker 它实际上处理加载文件 还有一个 ProgressWindow 它实现 PropertyChan
  • Java 砖块碰撞 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我一直在开发一款 Breakout 游戏 除了砖块碰撞之外 几乎所有的事情都完成了 球在墙壁和桨上弹跳得很好 但当它碰到砖块时 它会直接穿过它们 我很确定问题出在主类的 chec
  • RestSharp 忽略响应字符集编码

    我正在使用 RestSharp 版本 105 1 0 NET 4 5 1 对我们自己的 API 进行 REST 调用 此 API 发送带有以下特别感兴趣的标头的响应 Content Type application json Charset
  • 在 Java 中截取屏幕截图(机器人,代码可以工作,但不能与外部全屏应用程序一起使用)

    我使用以下代码来截取屏幕截图 Robot robot new Robot BufferedImage image robot createScreenCapture screenRectangle ImageIO write image p
  • 区分联合表中的行

    我正在使用此 sql 查询从两个不同的表中选择没有匹配列的数据 select from SELECT s shout id s user id s time FROM shouts s union all select v post id
  • Visual Studio 相当于 c++11(或更低版本)中的 gcc __attribute__((unused))?

    我正在尝试编写一个宏 以便在用户需要时使用抑制未使用的变量警告 例如 在派生类中 当您尚未实现整个类时 我知道我可以删除变量名称 但为了明确起见 我更喜欢宏 到目前为止我有这个 ifdef WIN32 define UNUSED x x e
  • 在 VS2013 中使用 VS2008 (v90) C++ 工具集?

    微软文档解释如何在 VS2013 中使用 2010 或 2012 工具集 有谁知道 2008 工具集是否也有向后支持 我正在从 2008 年升级到 2013 年的几个项目 但我的团队领导希望我们最初升级项目文件 但仍以与 2008 年相同的
  • Git svn 变基失败

    I use git svn跟踪 SVN 存储库 当我尝试做一个git svn rebase我收到此错误 Incomplete data Delta source ended unexpectedly 这是一个大型仓库 具有悠久的历史 仅仅获
  • MVC4 Windows 身份验证重定向到帐户/登录

    我正在设置Windows 身份验证在 MVC 4 应用程序中使用视觉工作室2013并使用IIS Express 开发服务器 但是 我被重定向到 Account Login 就好像我正在使用表单身份验证一样 我的 bin 文件夹 或任何地方
  • 在 RECEIVE_BOOT_COMPLETED 上通过广播接收器访问数据库

    当手机完成启动后 我想根据数据库中的小时 分钟 信息自动重新注册一些警报 我尝试使用广播接收器来执行此操作 但它不起作用 当尝试在启动时访问数据库 DB 帮助程序类时 它会崩溃 通过应用程序访问数据库帮助程序类时 它工作正常 这是可能的还是
  • boost::spirit::karma 输出引号内的字符串

    我正在尝试使用 boost spirit karma 转义引号中的字符串 如果它只是一个字符串 则效果很好 但是 对于 std vector 中 boost variant 中的字符串 则不然 只是打印字符串确实有效 但是我不太明白为什么
  • 字符串有隐藏字符,无法验证,

    大约2小时前我问了一个问题 不需要看问题 只是一个参考 使用node js存储图像出现错误 给出的解决方案实际上与我的代码相同 我试图找到我的代码和他的代码之间的差异 看看他做了什么修改才能使其工作 但没有任何修改 所以我想到尝试一下在线I
  • 既然“invoke”已被软弃用,那么替代方案是什么?

    rlang invoke 现已软弃用 purrr invoke 退休了 如今 以编程方式调用带有参数列表的函数的简洁方法是什么 tldr Use exec代替invoke use map2 plus exec代替invoke map 示例i
  • UIImagePickerController 如何隐藏翻转相机按钮?

    有没有办法隐藏 UIImagePickerController 内的翻转相机按钮 谢谢阅读 我最终使用 UIImagePickerController 的自定义子类来解决此 和其他 问题 import SMImagePickerContro
  • 将包含十六进制值的字节数组转换为十进制值

    我正在 c 中进行应用程序 这里我想将包含十六进制值的字节数组转换为十进制值 假设我有一个字节数组为 array 0 0X4E array 1 0X5E array 2 0X75 array 3 0X49 在这里 我想将该十六进制数组转换为
  • random_state在train_test_split和分类器中的作用

    基于这个答案 Scikit learn 中的随机状态 伪随机数 如果我使用相同的整数 比如 42 random state 然后每次进行训练 测试分割时 它应该给出相同的分割 即每次运行期间训练中的数据实例相同 测试时的数据实例相同 But
  • XSLT根据父子元素的值删除子元素

    我正在尝试使用这里使用的一些相同的逻辑https stackoverflow com a 10629806 662877 到不同的 XML 但没有得到预期的输出 如果 TERR KHM6 则删除 剥离这两个元素创建付款项目 and 创建支付