2014-07-01 10 views
2

У меня есть следующий XML, который я пытаюсь преобразовать во внутренний канонический формат. То, что мне нужно сделать, это проверить узел «id» в разделе назначенныйAuthor для определенной корневой строки и получить атрибут расширения на основе этого. Я должен использовать XSLT 1.0, потому что я использую MapTrader BizTalk для запуска этого XSLT.xsl: если не работает как ожидалось

Вот 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> 

Вот как я хочу, чтобы выглядеть трансформируется (НПИТЕ только атрибут расширение идентификатора узла, который атрибут корня равен «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:

<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> 

I получаем следующий результат (НПИ не появляется, потому что по какой-то причине, если заявление не вычисляемая верно, и я не могу понять, что я делаю неправильно):

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

XML-на самом деле путьболее сложный, чем это, и здесь слишком много ссылок, но это формат этого одного раздела компонентов (за вычетом данных, которые не относятся к этому вопросу). XSLT также намного сложнее, но это только одна проблема, с которой я сталкиваюсь. Любая помощь будет оценена по достоинству.

ответ

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 пространства имен будет), было бы намного чище объявить ваше пространство имен и использовать префикс в ваших xpaths вместо использования local-name().

+0

Хорошо, что имеет смысл, и это было проблемой. Большое спасибо. – Ritley572

Смежные вопросы