【问题标题】:xsl:if not working as expectedxsl:如果没有按预期工作
【发布时间】:2014-07-01 18:44:23
【问题描述】:

我尝试将以下 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 只是根属性等于“2.16.840.1.113883.4.6”的 id 节点的扩展属性):

<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 语句没有评估为真,我无法弄清楚我做错了什么):

<ns13:Insert>
  <ns13:Rows>
  </ns13:Rows>
</ns13:Insert>

XML 实际上比这复杂得多,这里有太多要链接的内容,但这是这个特定组件部分的格式(减去与此问题无关的数据)。 XSLT 也复杂得多,但这只是我遇到的一个问题。任何帮助将不胜感激。

【问题讨论】:

    标签: xml xslt biztalk biztalk-2010


    【解决方案1】:

    当你这样做时:

    <xsl:if test="string(../*[local-name()='id']/@root)='2.16.840.1.113883.4.6'">
    

    string() 为您提供第一个 id 元素的 @root 属性值。 (在 XSLT 2.0 中,这将是所有 id 元素的 @root 值。)这意味着您正在进行此比较:

    "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 中使用前缀而不是使用 @987654331 会更简洁@。

    【讨论】:

    • 嗯,这是有道理的,这就是问题所在。非常感谢。
    猜你喜欢
    • 2014-11-22
    • 2015-08-02
    • 2012-04-12
    • 2017-07-17
    • 2013-04-12
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多