第一次发布,请原谅。我目前正在尝试转换从国家医学图书馆的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&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()='']"/>