【问题标题】:XSLT: Testing data from transforming XML file against an external XML fileXSLT:测试来自转换 XML 文件与外部 XML 文件的数据
【发布时间】:2021-06-15 23:21:07
【问题描述】:

我正在尝试使用具有编码值的数据转换 XML 文档。我有第二个外部文档,这些值已解码。我想搜索外部文件以将处理文件中的元素值(QuantityUnitOfMeasure/Code)与外部文档中的元素值(root/row/NCItCode)匹配,以最终返回兄弟元素(/root/row/NCIDefinition)外部文件。这不起作用,XSLT 的新手。

代码:

<?xml version="1.0" encoding="UTF-8"?>
    
<xsl:variable name="externalDoc" select="document('NCPDP.xml')"/>    

<xsl:for-each select="Quantity">            
   <span>Quantity Unit Of Measure Code   : </span>
   <span> <xsl:value-of select="QuantityUnitOfMeasure/Code"/> </span>            
   <br></br>
   <xsl:for-each select="$externalDoc/root/row">
      <xsl:if test="NCItCode=QuantityUnitOfMeasure/Code">
         <span> <xsl:value-of select="NCIDefinition"/> </span>
      </xsl:if>
</xsl:for-each>

处理 XML:

<Quantity>
   <Value>300</Value>
   <CodeListQualifier>38</CodeListQualifier>
   <QuantityUnitOfMeasure>
      <Code>C48672</Code>
   </QuantityUnitOfMeasure>
</Quantity>

外部 XML 文件 (NCPDP.xml):

<root>
  <row>
    <NCItCode>C48672</NCItCode>
    <NCPDPPreferredTerm>Schedule I Substance</NCPDPPreferredTerm>
    <NCIDefinition>
       A category of drugs not considered legitimate for medical use.
    </NCIDefinition>
  </row>
<root>

预期结果:

Quantity Unit Of Measure Code   : C48672
A category of drugs not considered legitimate for medical use.

【问题讨论】:

  • 请张贴minimal reproducible example 显示 XML 文档和预期输出的示例。还要澄清这里需要应用的逻辑。
  • 需要一些细节,例如是调用应用程序已知的外部文档的 URI,还是包含在“主”文档的内容中。无论哪种方式,请阅读 document() 函数。
  • 它变得有点更清晰了。现在的问题是:您的处理器是否支持 XSLT 2.0?
  • 我相信我需要假设没有。仅限 XSLT 1.0
  • 为什么假设什么时候可以检查:stackoverflow.com/a/25245033/3016153

标签: xml xslt


【解决方案1】:

考虑以下示例:

输入 XML

<Quantities>
    <Quantity>
       <Value>300</Value>
       <CodeListQualifier>38</CodeListQualifier>
       <QuantityUnitOfMeasure>
          <Code>XYZ</Code>
       </QuantityUnitOfMeasure>
    </Quantity>
    <Quantity>
       <Value>300</Value>
       <CodeListQualifier>38</CodeListQualifier>
       <QuantityUnitOfMeasure>
          <Code>C48672</Code>
       </QuantityUnitOfMeasure>
    </Quantity>
</Quantities>

NCPDP.xml(更正为格式正确!!!)

<root>
  <row>
    <NCItCode>C48672</NCItCode>
    <NCPDPPreferredTerm>Schedule I Substance</NCPDPPreferredTerm>
    <NCIDefinition>
       A category of drugs not considered legitimate for medical use.
    </NCIDefinition>
  </row>
</root>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="externalDoc" select="document('NCPDP.xml')"/>    
                                           
<xsl:template match="/Quantities">
    <root>
        <xsl:for-each select="Quantity">            
            <span>Quantity Unit Of Measure Code   : </span>
            <span> 
                <xsl:value-of select="QuantityUnitOfMeasure/Code"/>
            </span>            
            <br/>
            <xsl:variable name="ext-entry" select="$externalDoc/root/row[NCItCode=current()/QuantityUnitOfMeasure/Code]" />
            <xsl:if test="$ext-entry">
                 <span> 
                    <xsl:value-of select="$ext-entry/NCIDefinition"/> 
                 </span>
            </xsl:if>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <span>Quantity Unit Of Measure Code   : </span>
  <span>XYZ</span>
  <br/>
  <span>Quantity Unit Of Measure Code   : </span>
  <span>C48672</span>
  <br/>
  <span>
       A category of drugs not considered legitimate for medical use.
    </span>
</root>

或者,您可以使用key 来执行查找 - 尽管这在 XSLT 1.0 中有点棘手,其中键仅在当前文档中有效:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="externalDoc" select="document('NCPDP.xml')"/>   
 
<xsl:key name="k1" match="row" use="NCItCode" />
                                          
<xsl:template match="/Quantities">
    <root>
        <xsl:for-each select="Quantity">            
            <span>Quantity Unit Of Measure Code   : </span>
            <span> 
                <xsl:value-of select="QuantityUnitOfMeasure/Code"/>
            </span>            
            <br/>
            <xsl:variable name="code" select="QuantityUnitOfMeasure/Code" />
            <!-- switch context to the external document in order to use key -->
            <xsl:for-each select="$externalDoc">
                <xsl:variable name="ext-entry" select="key('k1', $code)" />
                <xsl:if test="$ext-entry">
                     <span> 
                        <xsl:value-of select="$ext-entry/NCIDefinition"/> 
                     </span>
                </xsl:if>
            </xsl:for-each> 
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多