xsl:如果没有按预期工作

时间:2014-07-01 18:44:24

标签: xml xslt biztalk biztalk-2010

我有以下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也复杂得多,但这只是我遇到的一个问题。任何帮助将不胜感激。

1 个答案:

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