У меня есть следующий фрагмент кода для преобразования одного 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>
«не удается» - каким образом? Получаете ли вы сообщение об ошибке, никакого вывода вообще, другой вывод из того, что вы ожидаете ....? –
В случае 'generate-id()' является проблемой, вы можете попробовать другую формулу группировки Muenchian: 'path/field [count (. | Key ('groupKey',.) [1]) = 1]' – JLRishe
@ Ian - нет сообщения об ошибке, но данные не возвращаются. Весь раздел, отмеченный для этого, возвращает , где в любой другой среде синтаксического анализатора он возвращает все виды данных там с тем же источником и xslt. –