2013-05-14 10 views
2

Я хочу, чтобы создать плоский файл из XML с помощью XSLT с этим выходом в порядке, как показано ниже:Необходимость индивидуального заказа в плоский файл из XML с помощью XSLT

NM1 * CC * 1 * Smith * John *** * 34 * 999999999 ~
N3 * 100 Main Street ~

из этого XML:

<Claim> 
<Claimant 
    lastName="Smith" 
    firstName="John" 
    middleName="" 
    suffixName="" 
    indentificationCodeQualifier="34" 
    identificationCode="999999999"> 
    <ClaimantStreetLocation 
     primary="100 Main Street" 
     secondary=""/> 
</Claimant> 
</Claim> 

с XSLT, я создал я получаю выход в обратном желаемом порядке, как показано ниже, в связи с характером как XSLT работает, когда он обходит дерево ввода, которое я принимаю:

N3 * 100 Main Street ~
NM1 * CC * 1 * Smith * John **** 34 * 999999999 ~

Что мне нужно изменить/добавить, чтобы получить заказ, я ищу, чтобы XSLT я написал, как показано ниже: `

<xsl:template match="Claim/Claimant"> 
    <xsl:apply-templates /> 
    <xsl:text>NM1*CC*1*</xsl:text> 
    <xsl:value-of select="@lastName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@firstName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@middleName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@suffixName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@indentificationCodeQualifier" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@identificationCode" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template> 

<xsl:template match="Claim/Claimant/ClaimantStreetLocation"> 
    <xsl:apply-templates /> 
    <xsl:text>N3*</xsl:text> 
    <xsl:value-of select="@primary" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template>` 

есть ли способ сделать это без объединения двух тегов в один?

Любая обратная связь будет оценена по достоинству.

Я не знаю, имеет ли значение, но я использую xalan-java для обработки xslt в коде.

ответ

2

Если вы хотите обработать родителей перед детьми, вы должны переместить применить-шаблоны к концу вашего родительского шаблона:

<xsl:template match="Claim/Claimant"> 
    <xsl:text>NM1*CC*1*</xsl:text> 
    <xsl:value-of select="@lastName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@firstName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@middleName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@suffixName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@indentificationCodeQualifier" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@identificationCode" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="ClaimantStreetLocation"> 
    <xsl:apply-templates /> 
    <xsl:text>N3*</xsl:text> 
    <xsl:value-of select="@primary" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template>` 

Update: То, что здесь происходит,:

  1. Первым обрабатываемым элементом является Claim, но шаблоны не соответствуют ему, поэтому применяется шаблон по умолчанию, который обрабатывает шаблоны для своих дочерних узлов.

  2. Там, первый ребенок является заявителем, и у вас есть шаблон, который соответствует ему, поэтому он применяется.

  3. Далее, этот шаблон обрабатывается в порядке. Но критическая точка заключается в том, что apply-templates опускает атрибуты по умолчанию (см. What is the default select of XSLT apply-templates?), поэтому единственным совпадающим узлом является элемент ClaimantStreetLocation.

  4. Учитывая, что у вас есть шаблон, который соответствует ClaimantStreetLocation, он применяется. Итак, если вы хотите обработать сначала атрибуты, вы должны отложить шаблон приложения до тех пор, пока они не будут выбраны в вашем случае вручную.

+1

Thank you Shrein! Это сработало. Но как перемещается в нижней части родителя, заставляя родителя запускаться первым. Должен ли я называть теги , если мне нужна новая строка, которая появится после шаблона ClaimantStreetLocation? – user2382922

+0

Добавлено объяснение ответа. Надеюсь, поможет. – Shrein

+0

Это имеет смысл. Спасибо за объяснение Шрейна! – user2382922

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

  • Нет связанных вопросов^_^