jaxb transformerfactory xml към xml чрез xslt, използвайки create-id за уникални стойности

Имам следния код за трансформиране на един 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>

person Eva Donaldson    schedule 19.03.2013    source източник
comment
не успява - по какъв начин? Получавате ли съобщение за грешка, никакъв изход, различен изход от очаквания...?   -  person Ian Roberts    schedule 19.03.2013
comment
В случай, че generate-id() е проблемът, можете да опитате другата формула за групиране на Muenchian: path/field[count(. | key('groupKey', .)[1]) = 1]   -  person JLRishe    schedule 19.03.2013
comment
@Ian - няма съобщение за грешка, но не се връщат данни. Целият раздел, маркиран за това, връща ‹structureBody/›, където във всяка друга среда на анализатора връща всякакви данни там със същия източник и xslt.   -  person Eva Donaldson    schedule 19.03.2013
comment
Как изглежда изходният XML? Защо използвате Muenchian групиране на първо място, ако използвате XSLT 2.0?   -  person JLRishe    schedule 19.03.2013
comment
Групирането по Muenchian няма непременно да работи, ако имате предикатен среден път, както правите там. Трябва да поставите предиката между key() и [1] или в дефиницията на ключа.   -  person JLRishe    schedule 19.03.2013
comment
@JLRishe - Прав си, все още имам посочен 2.0, въпреки че се отказах от 2.0. Опитвах се да използвам извикването distinc-values() и то също се провали. Просто забравих да върна индикацията, когато публикувах това. Можете ли да ми дадете ред код, за да покажа какво имате предвид, като поставите предиката между key()...   -  person Eva Donaldson    schedule 19.03.2013
comment
Мисля, че типичният начин за групиране в XSLT 2.0 е да се използва xsl:for-each-group. Това, което имах предвид с изявлението, което цитирахте, беше нещо подобно: //questionResponse/question/questionGroup/externalCodes/externalCode/externalCode[generate-id() = generate-id(key('groupKey',.)[../../governingBody/internalCode = 'GHB-AHRQ-1'][1])]   -  person JLRishe    schedule 19.03.2013
comment
За съжаление поставянето на предиката там не помогна. Аз съм по-далеч, отколкото бях, но все още не съм там. Зададох ключа сега да бъде <xsl:key name="groupKey" match="//questionResponse/question/questionGroup/externalCodes/externalCode/externalCode/text()" use="." />, а изборът да бъде <xsl:for-each select="//questionResponse/question/questionGroup/externalCodes/externalCode[governingBody[internalCode='GVB-AHRQ-1']]/externalCode/text()[count(.|key('groupKey',.)[1]) = 1]">. Той връща стойности, но не се ограничава до уникалните екземпляри. Клавишите се повтарят. Още липсващи?   -  person Eva Donaldson    schedule 19.03.2013
comment
нека да продължим тази дискусия в чата   -  person Eva Donaldson    schedule 20.03.2013
comment
Можете ли да добавите пример за входния XML към въпроса си, както вече поисках?   -  person JLRishe    schedule 20.03.2013
comment
Благодаря ви много за цялата помощ. Реших да импортирам Saxon, за да активирам XSLT 2.0. Секунди по-късно групирането е перфектно и работи лесно.   -  person Eva Donaldson    schedule 20.03.2013


Отговори (1)


Реших да импортирам Saxon, за да активирам XSLT 2.0. Секунди по-късно групирането е перфектно и работи лесно.

person Community    schedule 09.05.2014