xslt mapping - PullRequest
       6

xslt mapping

3 голосов
/ 24 января 2011

У меня есть XML-файл со следующими значениями -

<InspectionChecklist>
    <InspectionChecklistItem>
        <ChecklistItemDescription>Frame damaged</ChecklistItemDescription>
        <ChecklistItemValue>1</ChecklistItemValue>
    </InspectionChecklistItem>
    <InspectionChecklistItem>
        <ChecklistItemDescription>Smokers Flag</ChecklistItemDescription>
        <ChecklistItemValue>1</ChecklistItemValue>
    </InspectionChecklistItem>
</InspectionChecklist>

И я хочу, чтобы вывод был похож -

<FrameDamage>Y</FrameDamage>
<SmokerFlag>Y</SmokerFlag>

Так что в исходном xml возможно, что у меня не будет ни ChecklistItemDescription, ни других описаний элементов контрольного списка, таких как -

Пример 1 -

Источник

<InspectionChecklist></InspectionChecklist>

Я хочу, чтобы вывод выглядел как

<FrameDamage>N</FrameDamage>
<SmokerFlag>N</SmokerFlag>

Пример 2-

Источник

<InspectionChecklist>
    <InspectionChecklistItem>
        <ChecklistItemDescription>Airbag Light</ChecklistItemDescription> 
        <ChecklistItemValue>1</ChecklistItemValue> 
    </InspectionChecklistItem>
    <InspectionChecklistItem>
        <ChecklistItemDescription>Smokers Flag</ChecklistItemDescription> 
        <ChecklistItemValue>1</ChecklistItemValue> 
    </InspectionChecklistItem>
</InspectionChecklist>

Вывод должен выглядеть как -

<FrameDamage>N</FrameDamage>
<SmokerFlag>Y</SmokerFlag>

Я сделал несколько способов и могу заставить работать отдельные. Но я не могу заставить их работать во всех возможных случаях.

Буду признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 24 января 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:output>
   <frame>
    <FrameDamage>N</FrameDamage>
    <FrameDamage>Y</FrameDamage>
   </frame>
   <smoker>
    <SmokerFlag>N</SmokerFlag>
    <SmokerFlag>Y</SmokerFlag>
   </smoker>
 </my:output>

 <xsl:variable name="vFrameOutputs" select="document('')/*/my:output/frame/*"/>
 <xsl:variable name="vSmokerOutputs" select="document('')/*/my:output/smoker/*"/>
 <xsl:variable name="vDoc" select="/"/>

    <xsl:template match="/">
     <xsl:copy-of select=
       "$vFrameOutputs[($vDoc/*/*/ChecklistItemDescription='Frame damaged')+1]"/>
     <xsl:copy-of select=
       "$vSmokerOutputs[($vDoc/*/*/ChecklistItemDescription='Smokers Flag')+1]"/>
    </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<InspectionChecklist>
    <InspectionChecklistItem>
        <ChecklistItemDescription>Frame damaged</ChecklistItemDescription>
        <ChecklistItemValue>1</ChecklistItemValue>
    </InspectionChecklistItem>
    <InspectionChecklistItem>
        <ChecklistItemDescription>Smokers2 Flag</ChecklistItemDescription>
        <ChecklistItemValue>1</ChecklistItemValue>
    </InspectionChecklistItem>
</InspectionChecklist>

дает желаемый, правильный результат :

<FrameDamage 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my">Y</FrameDamage>
<SmokerFlag 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my">N</SmokerFlag>

Заметка : пространства имен в результате не будут выводиться, когда вспомогательное содержимое в my:output помещено в его собственный файл - тогда вызовы функции document() необходимо изменить, чтобы отразить URI вспомогательного документа.

1 голос
/ 24 января 2011

Это выражение XPath

/InspectionChecklist
   /InspectionChecklistItem
      /ChecklistItemDescription = 'Frame damaged' 

Это приводит к логическому значению: есть ChecklistItemDescription со строковым значением «Frame dameged» (true) или нет (false).

Мы можем преобразовать это в Y или N этим выражением (между другими):

substring('NY', $condition + 1, 1)

Я оставляю вам композицию в качестве упражнения для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...