【问题标题】:XSLT Validation using for-each使用 for-each 进行 XSLT 验证
【发布时间】:2014-02-27 01:50:57
【问题描述】:

我正在尝试为 XSLT 验证模板编写逻辑,以检查 XML 消息中是否存在各种条件的重复循环。

消息的结构是

<VXU_V04.ORDER> One or more may be present, not a required group; I’m calling this “OrderGroup”
<ORC> Required; only one ORC Segment per OrderGroup allowed
<ORC.3> Required; only one ORC.3 field per ORC Segment allowed
<EI.1>, <EI.2>, <EI.3> and <EI.4> are sub-components of ORC.3

这四个字段有自己的验证,我需要编写代码。每个 ORC 段只有一个 ORC.3,每个 ORC.3 只有一组 EI 子组件。但是,我仍然需要考虑一个订单组中的多个 ORC 段的概念,因此我仍然需要使用 for-each 构造来考虑多个 ORC 段。

这是我的 ORC.3 验证模板:

<xsl:stylesheet version="2.0" xmlns:a="urn:hl7-org:v2xml" xmlns:dil="http://www.aegis.net/msg/filter/jaxb/rule" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!--      
         Must be VALUED AND 
         Must not repeat
         -->
    <xsl:variable name="OrderGroup" select="/a:VXU_V04/a:VXU_V04.ORDER"/>
    <xsl:variable name="ORCSegment" select="/a:VXU_V04/a:VXU_V04.ORDER/a:ORC"/>
    <xsl:variable name="ORC3Field" select="/a:VXU_V04/a:VXU_V04.ORDER/a:ORC/a:ORC.3"/>
    <xsl:variable name="EI1Field" select="/a:VXU_V04/a:VXU_V04.ORDER/a:ORC/a:ORC.3/a:EI.1"/>
    <xsl:variable name="EI2Field" select="/a:VXU_V04/a:VXU_V04.ORDER/a:ORC/a:ORC.3/a:EI.2"/>
    <xsl:variable name="EI3Field" select="/a:VXU_V04/a:VXU_V04.ORDER/a:ORC/a:ORC.3/a:EI.3"/>
    <xsl:variable name="EI4Field" select="/a:VXU_V04/a:VXU_V04.ORDER/a:ORC/a:ORC.3/a:EI.4"/>
    <xsl:template match="/">
        <dil:filterruleresult>
             <xsl:choose>
                 <xsl:when test= "count($OrderGroup)= 0">
                    <dil:message type="info">VXU Order Group not found.</dil:message>
                 </xsl:when>
             </xsl:choose>
             <xsl:for-each select="$OrderGroup">
                     <xsl:choose>
                       <xsl:when test="count(a:ORC)= 0">  
                          <dil:message type="error">When Order Group present, ORC Segment is required.</dil:message>
                       </xsl:when>
                       <xsl:when test="count(a:ORC)> 1">  
                        <dil:message type="error">Only one Order Segment (ORC) allowed per Order Group.</dil:message>
                       </xsl:when>
                       <xsl:otherwise>
                          <xsl:for-each select="a:ORC">
                             <xsl:choose>
                                 <xsl:when test="count(a:ORC.3)= 0">
                                    <dil:message type="error">ORC-3 Filler Order Number not found but is required.</dil:message>
                                 </xsl:when> 
                                 <xsl:when test="count(a:ORC.3)> 1">
                                     <dil:message type="error">Only one Filler Order Number (ORC-3) allowed per Order Segment.</dil:message>
                                 </xsl:when> 
                                 <xsl:when test="count(a:EI.1)> 1">
                                     <dil:message type="error">When present, only one Filler Order Number (ORC-3) allowed per Order Segment.</dil:message>
                                 </xsl:when> 
                                 <xsl:when test="count(a:EI.1)= 0">
                                     <dil:message type="error">When Filler Order Number Present, Entity Identifier (ORC-3/EI-1) is required.</dil:message>
                                 </xsl:when>
                                  <xsl:when test="count(a:EI.3)= 0 and count(a:EI.2)= 0">
                                     <dil:message type="error">When Filler Order Number Present, Namespace ID (ORC-3/EI-2) or Universal ID (ORC-3/EI-3) is required.</dil:message>
                                 </xsl:when>  
                                 <xsl:when test="count(a:EI.3)= 1 and count(a:EI.4)= 0">
                     <dil:message type="error">When Filler Order Number Universal ID is present, Universal ID Type (ORC-3/EI-4) is required.</dil:message>
                                 </xsl:when>
                                 <xsl:when test="count(a:EI.3)= 0 and count(a:EI.4)= 0">
                     <dil:message type="error">When Filler Order Number Universal ID is not present, Universal ID Type (ORC-3/EI-4) is not supported.</dil:message>
                                 </xsl:when> 
                                 <xsl:when test="count(a:ORC.3)= 1">
                                     <dil:message type="info">Value of '<xsl:value-of select="./a:EI.1"/>', '<xsl:value-of select="./a:EI.2"/>', '<xsl:value-of select="./a:EI.3"/>', '<xsl:value-of select="./a:EI.4"/>' found for Filler Order Number (ORC-2).</dil:message>
                                 </xsl:when>
                             </xsl:choose>
                          </xsl:for-each>  
                       </xsl:otherwise>
                      </xsl:choose> 
             </xsl:for-each>      
        </dil:filterruleresult>
    </xsl:template>
</xsl:stylesheet>

问题是模板根本找不到我的 EI 字段。我一直遇到错误“当填写者订单号存在时,需要实体标识符 (ORC-3/EI-1)”。但我的测试消息中确实有 EI-1 值。

这是我的测试消息的相关部分:

  <VXU_V04.ORDER>
    <ORC>
      <ORC.1>RE</ORC.1>
      <ORC.3>
        <EI.1>197023</EI.1>
        <EI.2>DCS</EI.2>
      </ORC.3>
      <ORC.10>
        <XCN.2>
          <FN.1>Clerk</FN.1>
        </XCN.2>
        <XCN.3>Myron</XCN.3>
      </ORC.10>
      <ORC.17>
        <CE.1>DCS</CE.1>
        <CE.2>Dabig Clinical System</CE.2>
        <CE.3>StateIIS</CE.3>
      </ORC.17>
    </ORC>
    <RXA>
      <RXA.1>0</RXA.1>
      <RXA.2>1</RXA.2>
      <RXA.3>
        <TS.1>20090415132511</TS.1>
      </RXA.3>
      <RXA.4>
        <TS.1>20090415132511</TS.1>
      </RXA.4>
      <RXA.5>
        <CE.1>31</CE.1>
        <CE.2>Hep B Peds NOS</CE.2>
        <CE.3>CVX</CE.3>
      </RXA.5>
      <RXA.6>999</RXA.6>
      <RXA.9>
        <CE.1>01</CE.1>
        <CE.2>historical record</CE.2>
        <CE.3>NIP0001</CE.3>
      </RXA.9>
    </RXA>
  </VXU_V04.ORDER>
  <VXU_V04.ORDER>
    <ORC>
      <ORC.1>RE</ORC.1>
      <ORC.3>
        <EI.1>197027</EI.1>
        <EI.2>DCS</EI.2>
      </ORC.3>
      <ORC.10>
        <XCN.2>
          <FN.1>Clerk</FN.1>
        </XCN.2>
        <XCN.3>Myron</XCN.3>
      </ORC.10>
      <ORC.12>
        <XCN.2>
          <FN.1>Pediatric</FN.1>
        </XCN.2>
        <XCN.3>MARY</XCN.3>
        <XCN.10>L</XCN.10>
        <XCN.21>MD</XCN.21>
      </ORC.12>
    </ORC>
    <RXA>
      <RXA.1>0</RXA.1>
      <RXA.2>1</RXA.2>
      <RXA.3>
        <TS.1>20090531132511</TS.1>
      </RXA.3>
      <RXA.4>
        <TS.1>20090531132511</TS.1>
      </RXA.4>
      <RXA.5>
        <CE.1>48</CE.1>
        <CE.2>HIB PRP-T</CE.2>
        <CE.3>CVX</CE.3>
      </RXA.5>
      <RXA.6>999</RXA.6>
      <RXA.9>
        <CE.1>00</CE.1>
        <CE.2>new Immunization record</CE.2>
        <CE.3>NIP0001</CE.3>
      </RXA.9>
      <RXA.10>
        <XCN.2>
          <FN.1>Sticker</FN.1>
        </XCN.2>
        <XCN.3>Nurse</XCN.3>
      </RXA.10>
      <RXA.11>
        <LA2.4>
          <HD.1>DCS_DC</HD.1>
        </LA2.4>
      </RXA.11>
      <RXA.15>33k2a</RXA.15>
      <RXA.17>
        <CE.1>PMC</CE.1>
        <CE.2>sanofi</CE.2>
        <CE.3>MVX</CE.3>
      </RXA.17>
    </RXA>
    <RXR>
      <RXR.1>
        <CE.1>C28161</CE.1>
        <CE.2>IM</CE.2>
        <CE.3>NCIT</CE.3>
        <CE.4>IM</CE.4>
        <CE.5>IM</CE.5>
        <CE.6>HL70162</CE.6>
      </RXR.1>
    </RXR>
  </VXU_V04.ORDER>
  <VXU_V04.ORDER>
    <ORC>
      <ORC.1>RE</ORC.1>
      <ORC.3>
        <EI.1>197028</EI.1>
        <EI.2>DCS</EI.2>
      </ORC.3>
      <ORC.10>
        <XCN.2>
          <FN.1>Clerk</FN.1>
        </XCN.2>
        <XCN.3>Myron</XCN.3>
      </ORC.10>
      <ORC.12>
        <XCN.2>
          <FN.1>Pediatric</FN.1>
        </XCN.2>
        <XCN.3>MARY</XCN.3>
        <XCN.10>L</XCN.10>
        <XCN.21>MD</XCN.21>
      </ORC.12>
    </ORC>
    <RXA>
      <RXA.1>0</RXA.1>
      <RXA.2>1</RXA.2>
      <RXA.3>
        <TS.1>20090531132511</TS.1>
      </RXA.3>
      <RXA.4>
        <TS.1>20090531132511</TS.1>
      </RXA.4>
      <RXA.5>
        <CE.1>110</CE.1>
        <CE.2>DTAP-Hep B-IPV</CE.2>
        <CE.3>CVX</CE.3>
      </RXA.5>
      <RXA.6>999</RXA.6>
      <RXA.9>
        <CE.1>00</CE.1>
        <CE.2>new immunization record</CE.2>
        <CE.3>NIP0001</CE.3>
      </RXA.9>
      <RXA.10>
        <XCN.2>
          <FN.1>Sticker</FN.1>
        </XCN.2>
        <XCN.3>Nurse</XCN.3>
      </RXA.10>
      <RXA.11>
        <LA2.4>
          <HD.1>DCS_DC</HD.1>
        </LA2.4>
      </RXA.11>
      <RXA.15>xy3939</RXA.15>
      <RXA.17>
        <CE.1>SKB</CE.1>
        <CE.2>GSK</CE.2>
        <CE.3>MVX</CE.3>
      </RXA.17>
    </RXA>
    <RXR>
      <RXR.1>
        <CE.1>IM</CE.1>
        <CE.2>IM</CE.2>
        <CE.3>HL70162</CE.3>
        <CE.4>C28161</CE.4>
        <CE.5>IM</CE.5>
        <CE.6>NCIT</CE.6>
      </RXR.1>
    </RXR>
  </VXU_V04.ORDER>

非常感谢任何建议。

谢谢!

【问题讨论】:

  • XSLT Validation: using for-each 的可能重复项
  • 这不是重复,而是同一问题的扩展。谢谢!
  • 你是对的!我的错 - 我没有仔细观察它。

标签: xml xslt


【解决方案1】:

当您查找 EI.x 字段时,您还没有找到正确的级别:

<xsl:for-each select="a:ORC">
 <xsl:choose>
     <xsl:when test="count(a:ORC.3)= 0">
        <dil:message type="error">ORC-3 Filler Order Number not found but is required.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:ORC.3)> 1">
         <dil:message type="error">Only one Filler Order Number (ORC-3) allowed per Order Segment.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:EI.1)> 1">
         <dil:message type="error">When present, only one Filler Order Number (ORC-3) allowed per Order Segment.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:EI.1)= 0">
         <dil:message type="error">When Filler Order Number Present, Entity Identifier (ORC-3/EI-1) is required.</dil:message>
     </xsl:when>
      <xsl:when test="count(a:EI.3)= 0 and count(a:EI.2)= 0">
         <dil:message type="error">When Filler Order Number Present, Namespace ID (ORC-3/EI-2) or Universal ID (ORC-3/EI-3) is required.</dil:message>
     </xsl:when>  
     <xsl:when test="count(a:EI.3)= 1 and count(a:EI.4)= 0">
       <dil:message type="error">When Filler Order Number Universal ID is present, Universal ID Type (ORC-3/EI-4) is required.</dil:message>
     </xsl:when>
     <xsl:when test="count(a:EI.3)= 0 and count(a:EI.4)= 0">
      <dil:message type="error">When Filler Order Number Universal ID is not present, Universal ID Type (ORC-3/EI-4) is not supported.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:ORC.3)= 1">
         <dil:message type="info">Value of '<xsl:value-of select="./a:EI.1"/>', '<xsl:value-of select="./a:EI.2"/>', '<xsl:value-of select="./a:EI.3"/>', '<xsl:value-of select="./a:EI.4"/>' found for Filler Order Number (ORC-2).</dil:message>
     </xsl:when>
 </xsl:choose>
</xsl:for-each>  

您需要添加另一个级别才能获得 EI。您可以通过额外的 for-each/select 或通过如下更改 xpath 来做到这一点。

<xsl:for-each select="a:ORC">
 <xsl:choose>
     <xsl:when test="count(a:ORC.3)= 0">
        <dil:message type="error">ORC-3 Filler Order Number not found but is required.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:ORC.3)> 1">
         <dil:message type="error">Only one Filler Order Number (ORC-3) allowed per Order Segment.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:ORC.3/a:EI.1)> 1">
         <dil:message type="error">When present, only one Filler Order Number (ORC-3) allowed per Order Segment.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:ORC.3/a:EI.1)= 0">
         <dil:message type="error">When Filler Order Number Present, Entity Identifier (ORC-3/EI-1) is required.</dil:message>
     </xsl:when>
      <xsl:when test="count(a:ORC.3/a:EI.3)= 0 and count(a:ORC.3/a:EI.2)= 0">
         <dil:message type="error">When Filler Order Number Present, Namespace ID (ORC-3/EI-2) or Universal ID (ORC-3/EI-3) is required.</dil:message>
     </xsl:when>  
     <xsl:when test="count(a:ORC.3/a:EI.3)= 1 and count(a:ORC.3/a:EI.4)= 0">
       <dil:message type="error">When Filler Order Number Universal ID is present, Universal ID Type (ORC-3/EI-4) is required.</dil:message>
     </xsl:when>
     <xsl:when test="count(a:ORC.3/a:EI.3)= 0 and count(a:ORC.3/a:EI.4)= 0">
      <dil:message type="error">When Filler Order Number Universal ID is not present, Universal ID Type (ORC-3/EI-4) is not supported.</dil:message>
     </xsl:when> 
     <xsl:when test="count(a:ORC.3/a:ORC.3)= 1">
         <dil:message type="info">Value of '<xsl:value-of select="./a:EI.1"/>', '<xsl:value-of select="./a:EI.2"/>', '<xsl:value-of select="./a:EI.3"/>', '<xsl:value-of select="./a:EI.4"/>' found for Filler Order Number (ORC-2).</dil:message>
     </xsl:when>
 </xsl:choose>
</xsl:for-each>  

【讨论】:

  • 我明白你在说什么。在我第一次检查 EI 字段之前,我最终添加了语句“”。我不是程序员,所以我不确定我的方法是否是最好的方法,但它确实有效。谢谢你的回答!
  • 是的,无论哪种方式都行。如果有多个 ORC.3 元素,那么您所做的就是最好的,从长远来看几乎没有什么区别。如果答案是正确的,您应该通过单击相应答案旁边的勾号将其标记为已解决(避免其他人回答相同的问题)。
猜你喜欢
  • 2014-02-23
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多