【问题标题】:Loop through EDI to XML file using XSLT使用 XSLT 通过 EDI 循环到 XML 文件
【发布时间】:2017-11-22 01:37:18
【问题描述】:

我是 XSLT 和 XML 的新手,所以如果我的术语不正确,请原谅。我有一个 XML 文件,它是从 EDI 文件转换而来的,特别是我目前正在尝试映射到 SQL 表的 835。在将 EDI 文件转换为 XML 后,我正在使用 XSLT 以加载它。这是 XML 的 sn-p,因此您可以看到它的外观,(注意,当前加载在一行中,如我知道我必须循环才能插入所有行。我只是不了解节点和子节点(?)的正确结构,当我有诸如 LOOP_2000 之类的节点时,具有诸如 LOOP_2100 之类的子节点,以及一个子节点被命名为 LOOP_2110)

<!--LOOP 2000 Columns-->
                        <!--LX Columns-->
                        <_2000_LX01_AssignedNumber>
                            <xsl:value-of 
select="transaction/LOOP_2000/LX/LX01" />
                        </_2000_LX01_AssignedNumber>

<!--LOOP 2000 Columns-->
<!--CAS Columns-->
                        <_2100_CAS01_ClaimAdjustmentGroupCode>
                            <xsl:value-of 
select="transaction/LOOP_2000/LOOP_2100/CAS/CAS01" />
                        </_2100_CAS01_ClaimAdjustmentGroupCode>
                        <_2100_CAS02_AdjustmentReasonCode>
                            <xsl:value-of 
select="transaction/LOOP_2000/LOOP_2100/CAS/CAS02" />
                        </_2100_CAS02_AdjustmentReasonCode>
                        <_2100_CAS03_AdjustmentAmount>
                            <xsl:value-of 
select="transaction/LOOP_2000/LOOP_2100/CAS/CAS03" />
                        </_2100_CAS03_AdjustmentAmount>

我知道我可以使用类似的东西,但是当我这样做时它会失败或继续只插入一行。很遗憾,由于 HIPAA,我无法共享 XML 文件本身,但我希望我已经提供了足够的信息。

TLDR:我需要帮助循环遍历 XML 文件中的每个节点,以将所有数据插入到 SQL 表中的单独行中。

【问题讨论】:

  • 请发minimal reproducible example - 包括输入和预期输出。
  • 由于如上所述的 HIPAA,这是我可以包含的尽可能多的内容。最终输出只是从每个节点中获取第一个值,而不是遍历每个节点来为完整的文件数据插入新行。

标签: xml loops xslt foreach


【解决方案1】:

确实没有给你足够的细节,所以我会尝试猜测;-)

根据我在 835 上找到的来自:

我创建了一个与您的类似的示例 XML 实例:

<X12_835>
  <LOOP_2000>
    <LX>
      <LX01>1</LX01>
    </LX>
    <LOOP_2100>
      <CLP>
        <CLP01>123</CLP01>
      </CLP>
      <CAS>
        <CAS01>CO</CAS01>
      </CAS>
    </LOOP_2100>
    <LOOP_2100>
      <CLP>
        <CLP01>234</CLP01>
      </CLP>
      <CAS>
        <CAS01>CO</CAS01>
      </CAS>
    </LOOP_2100>
  </LOOP_2000>
  <LOOP_2000>
    <LX>
      <LX01>2</LX01>
    </LX>
    <LOOP_2100>
      <CLP>
        <CLP01>345</CLP01>
      </CLP>
      <CAS>
        <CAS01>CO</CAS01>
      </CAS>
    </LOOP_2100>
    <LOOP_2100>
      <CLP>
        <CLP01>456</CLP01>
      </CLP>
      <CAS>
        <CAS01>CO</CAS01>
      </CAS>
    </LOOP_2100>
  </LOOP_2000>
</X12_835>

我希望我不会太远......

然后,如果您运行以下 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/X12_835">
    <lines>
      <xsl:for-each select="LOOP_2000">
        <xsl:for-each select="LOOP_2100">
          <line>
            <_2000_LX01_AssignedNumber>
              <xsl:value-of select="parent::LOOP_2000/LX/LX01"/>
            </_2000_LX01_AssignedNumber>
            <_2100_CAS01_ClaimAdjustmentGroupCode>
              <xsl:value-of select="CAS/CAS01"/>
            </_2100_CAS01_ClaimAdjustmentGroupCode>
            <!-- to be continued ;-) -->
          </line>
        </xsl:for-each>
      </xsl:for-each>
  </lines>
  </xsl:template>
</xsl:stylesheet>

你应该得到:

<lines>
  <line>
    <_2000_LX01_AssignedNumber>1</_2000_LX01_AssignedNumber>
    <_2100_CAS01_ClaimAdjustmentGroupCode>CO</_2100_CAS01_ClaimAdjustmentGroupCode>
  </line>
  <line>
    <_2000_LX01_AssignedNumber>1</_2000_LX01_AssignedNumber>
    <_2100_CAS01_ClaimAdjustmentGroupCode>CO</_2100_CAS01_ClaimAdjustmentGroupCode>
  </line>
  <line>
    <_2000_LX01_AssignedNumber>2</_2000_LX01_AssignedNumber>
    <_2100_CAS01_ClaimAdjustmentGroupCode>CO</_2100_CAS01_ClaimAdjustmentGroupCode>
  </line>
  <line>
    <_2000_LX01_AssignedNumber>2</_2000_LX01_AssignedNumber>
    <_2100_CAS01_ClaimAdjustmentGroupCode>CO</_2100_CAS01_ClaimAdjustmentGroupCode>
  </line>
</lines>

这可能看起来像您正在寻找的...请告诉我!

附:据我所知,使用“parent::”轴并不是编写此类 XSLT 的最高效方式,如果您的输入文件很大,您可能需要使用 &lt;xsl:key&gt; ...

【讨论】:

  • 我将在接下来的几个小时内试一试。感谢您抽出宝贵时间进行研究和回复!
猜你喜欢
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多