2013-03-19 2 views
1

У меня есть следующий фрагмент кода для преобразования одного XML-документа в другой с помощью XSLTJAXB TransformerFactory XML в XML с помощью XSLT с помощью генерировать идентификатор для уникальных значений

 TransformerFactory tFactory = TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(
       this.getClass().getClassLoader().getResourceAsStream(ie.getXslFileName()))); 
     transformer.transform(
       new javax.xml.transform.stream.StreamSource(reader), 
       new javax.xml.transform.stream.StreamResult(stream)); 
     output.put(fileName, stream.toByteArray()); 

Он отлично работает, если я не пытаюсь выбрать деликатные значения. Однако, как только я помещаю в строку сгенерированного идентификатора и ключ, он терпит неудачу. В каждом другом тестовом инструменте я использую преобразование идеально, поэтому я думаю, что это ограничение в трансформаторе jaxb? Есть ли у кого-нибудь какие-либо предложения относительно того, как я могу выбрать уникальные значения, которые будут работать здесь? Включить преобразование jaxb? ИЛИ, альтернативно, есть ли другой трансформатор, который я мог бы использовать, что бы сделать трюк?

XSLT, который работает везде, но здесь:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" /> 

    <xsl:key name="groupKey" 
      match="//questionGroup/externalCodes/externalCode/externalCode/text()" 
      use="." /> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="submissionReport"/> 
    </xsl:template> 

    <xsl:template match="submissionReport" > 
    <component> 
     <structuredBody> 
     <xsl:for-each select="//questionResponse/question/questionGroup 
           /externalCodes/externalCode[governingBody 
           [internalCode='GVB-AHRQ-1']] 
           /externalCode/text()[generate-id() = 
            generate-id(key('groupKey',.)[1])]"> 
      <component> 
      <section> 
       <entry> 
       <templateId> 
        <xsl:attribute name="root"> 
        <xsl:value-of select="."/> 
        </xsl:attribute> 
       </templateId> 
       <organizer classCode="CLUSTER" moodCode="EVN"> 
        <id nullFlavor="NA"/> 
        <statusCode code="completed"/> 
        <xsl:call-template name="groupedResponses"> 
        <xsl:with-param name="groupInternalCode" select="."/> 
        </xsl:call-template> 
       </organizer> 
       </entry> 
      </section> 
      </component> 
     </xsl:for-each> 
     </structuredBody> 
    </component> 
    </xsl:template> 

    <xsl:template name="groupedResponses"> 
    <xsl:param name="groupInternalCode"/> 
    <xsl:for-each select="//questionResponse[question[externalCodes 
          [externalCode[governingBody[internalCode='GVB-AHRQ-1'] and 
           not(externalCode='DE42') and not(externaCode='DE3') and 
           not(externalCode='DE46') and not(externalCode='DE49') and 
           not(externalCode='DE30')]] and 
           questionGroup[externalCodes[externalCode[governingBody[internalCode='GVB-AHRQ-1'] and 
           externalCode=$groupInternalCode]]]]]"> 
     <component> 
     <observation> 
      <xsl:attribute name="classCode">OBS</xsl:attribute> 
      <xsl:attribute name="moodCode">EVN</xsl:attribute> 
      <templateId> 
      <xsl:attribute name="root">2.16.840.1.113883.3.263.1.11.3.100</xsl:attribute> 
      </templateId> 
      <xsl:for-each select="question/externalCodes/externalCode 
            [governingBody[internalCode='GVB-AHRQ-1'] or 
            governingBody[internalCode='GVB-CDCRACE-1'] or 
            governingBody[internalCode='GVB-HL7NULL-1'] or 
            governingBody[internalCode='GVB-HL7GENDER-1']]"> 
      <!-- Question information --> 
      <code> 
       <xsl:attribute name="code"> 
       <xsl:value-of select="externalCode"/> 
       </xsl:attribute> 
       <xsl:attribute name="displayName"> 
       <xsl:value-of select="../../text"/> 
       </xsl:attribute> 
       <xsl:attribute name="codeSystem"> 
       <xsl:value-of select="governingBody/externalCode"/> 
       </xsl:attribute> 
       <xsl:attribute name="codeSystemName"> 
       <xsl:value-of select="governingBody/name"/> 
       </xsl:attribute> 
      </code> 

      <!-- Response information. Can be more than one --> 
      <xsl:for-each select="../../../response"> 
       <value> 
       <xsl:choose> 
        <xsl:when test="responseOption"> 
        <xsl:for-each select="responseOption/externalCodes/externalCode"> 
         <value> 
         <xsl:attribute name="type">CD</xsl:attribute> 
         <xsl:attribute name="code"> 
          <xsl:value-of select="externalCode"/> 
         </xsl:attribute> 
         <xsl:attribute name="displayName"> 
          <xsl:value-of select="../../response"/> 
         </xsl:attribute> 
         <xsl:attribute name="codeSystem"> 
          <xsl:value-of select="governingBody/externalCode"/> 
         </xsl:attribute> 
         <xsl:attribute name="codeSystemName"> 
          <xsl:value-of select="governingBody/name"/> 
         </xsl:attribute> 
         </value> 
        </xsl:for-each> 
        </xsl:when> 

        <xsl:otherwise> 
        <value> 
         <xsl:attribute name="type">ED</xsl:attribute> 
         <xsl:attribute name="mediaType">text/plain</xsl:attribute> 
         <xsl:value-of select="response"/> 
        </value> 
        </xsl:otherwise> 
       </xsl:choose> 
       </value> 
      </xsl:for-each> 
      </xsl:for-each> 
     </observation> 
     </component> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+0

«не удается» - каким образом? Получаете ли вы сообщение об ошибке, никакого вывода вообще, другой вывод из того, что вы ожидаете ....? –

+0

В случае 'generate-id()' является проблемой, вы можете попробовать другую формулу группировки Muenchian: 'path/field [count (. | Key ('groupKey',.) [1]) = 1]' – JLRishe

+0

@ Ian - нет сообщения об ошибке, но данные не возвращаются. Весь раздел, отмеченный для этого, возвращает , где в любой другой среде синтаксического анализатора он возвращает все виды данных там с тем же источником и xslt. –

ответ

0

Я решил пойти с импортом Saxon, чтобы включить XSLT 2.0. Через несколько секунд группировка идеальна и работает легко.