第一次发布,请原谅。我目前正在尝试转换从国家医学图书馆的DailyMed网站检索的Avycaz的结构化产品标签的xml文件。我想将通过REST响应从RxNav API(位于:RxNav API)获得的数据插入我的结果转换中。

我的设置:

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>


my.xslt中的REST_response.xml API调用:

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()

有没有一种更好的方法可以实际访问该节点并且不涉及字符串匹配?

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

最佳答案

这是因为您正在使用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()='']"/>

08-18 08:50
查看更多