更正 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&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"/>
.
第一次发帖,请见谅。我目前正在尝试将从国家医学图书馆 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&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"/>
.