我有以下XML我试图转换为内部规范格式。我需要做的是测试assignedAuthor部分中的'id'节点以获取特定的根字符串,并根据它获取扩展属性。我必须使用XSLT 1.0,因为我使用BizTalk映射器来运行此XSLT。
这是XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ClinicalDocument xmlns="urn:hl7-org:v3">
<component>
<structuredBody>
<component>
<section>
<entry>
<act>
<author>
<assignedAuthor>
<id root="1.2.840.113619.21.1.4780296594025264329.2.2" extension="1609858104000010"/>
<id root="2.16.840.1.113883.4.6" extension="1437282605"/>
</assignedAuthor>
</author>
</act>
</entry>
</section>
</component>
</structuredBody>
</component>
</ClinicalDocument>
以下是我希望它看起来如何变换(NPI只是id属性的扩展属性,其根属性等于“2.16.840.1.113883.4.6”):
<ns13:Insert>
<ns13:Rows>
<ns13:NPI>1437282605</NPI>
</ns13:Rows>
</ns13:Insert>
当我使用这个XSLT(没有总体模板等)时:
<ns13:Insert>
<ns13:Rows>
<xsl:for-each select="*/*[local-name()='author']/*[local-name()='assignedAuthor']/*[local-name()='id']">
<xsl:if test="../*[local-name()='id']/@root">
<ns13:NPI>
<xsl:value-of select="./@extension" />
</ns13:NPI>
</xsl:if>
</xsl:for-each>
</ns13:Rows>
</ns13:Insert>
我得到了这个结果(这是预期的,因为我没有测试特定的根属性字符串):
<ns13:Insert>
<ns13:Rows>
<ns13:NPI>1609858104000010</ns13:NPI>
<ns13:NPI>1437282605</ns13:NPI>
</ns13:Rows>
</ns13:Insert>
但是当我尝试在XSLT中使用这个if语句时:
<ns13:Insert>
<ns13:Rows>
<xsl:for-each select="*/*[local-name()='author']/*[local-name()='assignedAuthor']/*[local-name()='id']">
<xsl:if test="string(../*[local-name()='id']/@root)='2.16.840.1.113883.4.6'">
<ns13:NPI>
<xsl:value-of select="./@extension" />
</ns13:NPI>
</xsl:if>
</xsl:for-each>
</ns13:Rows>
</ns13:Insert>
我得到以下结果(NPI没有显示,因为由于某种原因,if语句没有评估为true而我无法弄清楚我做错了什么):
<ns13:Insert>
<ns13:Rows>
</ns13:Rows>
</ns13:Insert>
XML实际上比这更复杂,这里链接太多了,但这是一个特定组件部分的格式(减去与此问题无关的数据)。 XSLT也复杂得多,但这只是我遇到的一个问题。任何帮助将不胜感激。
答案 0 :(得分:1)
当你这样做时:
<xsl:if test="string(../*[local-name()='id']/@root)='2.16.840.1.113883.4.6'">
string()
为您提供了第一个@root
元素的id
属性值。 (在XSLT 2.0中,它将是所有@root
元素的id
值。)这意味着您正在进行此比较:
"1.2.840.113619.21.1.4780296594025264329.2.2" = "2.16.840.1.113883.4.6"
这是假的。
您的上下文已经id
,因此只需测试@root
...
<xsl:if test="@root='2.16.840.1.113883.4.6'">
此外,除非有充分的理由(就像你不知道命名空间uri将是什么),声明你的命名空间并在你的xpath中使用前缀而不是使用它会更加清晰local-name()
。