更正 xslt/xpath 语法以访问从 REST API 调用检索到的 xml 节点

Correct xslt/xpath syntax for accessing xml nodes retrieved from REST API call

第一次发帖,请见谅。我目前正在尝试将从国家医学图书馆 DailyMed website. I want to insert data obtained via REST response from the RxNav API (located at: RxNav API) 检索到的 Avycaz 结构化产品标签的 xml 文件转换为我的结果转换。

我的设置:

Avycaz.xml(太大而无法包括在下面)+ my.xslt + REST_response.xml = output.xml

REST_response.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rxnormdata>
  <idGroup>
    <idType>NDC</idType>
    <id>0456-2700-10</id>
    <rxnormId>1603845</rxnormId>
  </idGroup>
</rxnormdata>

REST_response.xml API 内调用 my.xslt:

https://rxnav.nlm.nih.gov/REST/Prescribe/rxcui?idtype=NDC&id=0456-2700-10

my.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="rxnav" version="2.0" 
  xmlns:fn="http://www.w3.org/2004/07/xpath-functions" 
  xmlns:rxnav="https://rxnav.nlm.nih.gov/REST/"
  xmlns:xdt="http://www.w3.org/2001/XMLSchema" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xpath-default-namespace="urn:hl7-org:v3"
  xsi:schemaLocation="urn:hl7-org:v3 http://www.accessdata.fda.gov/spl/schema/spl.xsd">
  <xsl:output encoding="UTF-8" indent="yes" method="xml" omit-xml-declaration="yes"/>

  <xsl:variable name="NDC" select="'0456-2700-10'"/>
  <!--This data would actually be imported from Avycaz.xml
      Hence all of the xmlns attributes above-->

  <xsl:variable name="REST_response" 
    select="document(concat('https://rxnav.nlm.nih.gov/REST/Prescribe/rxcui?idtype=NDC&amp;id=',
    $NDC))"/>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:element exclude-result-prefixes="#all" name="api-tests">
        <para>
            <xsl:text>NDC: </xsl:text>
            <xsl:value-of select="$NDC"/>
        </para>
        <para>
            <xsl:text>RxCUI_1: 
            </xsl:text>
            <xsl:value-of select="$REST_response"/>
            <xsl:text>
     Result: Fail</xsl:text>
        </para>
        <para>
            <xsl:text>RxCUI_2: 
            </xsl:text>
            <xsl:value-of select="$REST_response/rxnormdata/idGroup/rxnormId"/>
            <xsl:text>
     Result: Fail</xsl:text>
        </para>
        <para>
            <xsl:text>RxCUI_3: 
            </xsl:text>
            <xsl:value-of select="$REST_response//rxnormId"/>
            <xsl:text>
     Result: Fail</xsl:text>
        </para>
        <para>
            <xsl:text>RxCUI_4: 
            </xsl:text>
            <xsl:value-of select="$REST_response//rxnav:rxnormId"/>
            <xsl:text>
     Result: Fail</xsl:text>
        </para>
        <para>
            <xsl:text>RxCUI_5: 
            </xsl:text>
            <xsl:value-of select="$REST_response//*[local-name()[contains(., 'rxnormId')]]/text()"/>
            <xsl:text>
     Result: Success</xsl:text>
        </para>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

output.xml:

<api-tests>
 <para>NDC: 0456-2700-10</para>
 <para>RxCUI_1: 
       NDC0456-2700-101603845
       Result: Fail</para>
 <para>RxCUI_2: 

       Result: Fail</para>
 <para>RxCUI_3: 

       Result: Fail</para>
 <para>RxCUI_4: 

       Result: Fail</para>
 <para>RxCUI_5: 
       1603845
       Result: Success</para>
</api-tests>

我想将 <rxnormId>1603845<rxnormId> 元素中的数据插入到我生成的转换中。我尝试过的唯一可行的方法是使用 XPATH 语句:$REST_response//*[local-name()[contains(., 'rxnormId')]]/text()

有没有更好的方法,真正访问节点,不涉及字符串匹配?

任何帮助将不胜感激。提前致谢!

直接通过id查找:

//rxnnormid

这是因为您正在使用 xpath-default-namespace="urn:hl7-org:v3"。 REST 响应不在命名空间中,因此您的 xpath 不匹配。

你可以做的是通过使用 * 作为前缀来匹配任何命名空间中的 rxnormId:

<xsl:value-of select="$REST_response//*:rxnormId"/>

如果你想确保只匹配没有命名空间的rxnormId,你可以测试命名空间uri:

<xsl:value-of select="$REST_response//*:rxnormId[namespace-uri()='']"/>

如前所述,您的样式表有 xpath-default-namespace="urn:hl7-org:v3"。如果您不想或不需要该名称空间中的 select 元素,请将其删除或在本地覆盖它,如 <xsl:value-of xpath-default-namespace="" select="$REST_response/rxnormdata/idGroup/rxnormId"/>.