2011-01-24 3 views
3

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

<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> 

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

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

+0

Это может помочь разместить некоторые из ваших XSLT. –

+0

Хороший вопрос, +1. См. Мой ответ для полного и короткого решения. :) –

ответ

1

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

/InspectionChecklist 
    /InspectionChecklistItem 
     /ChecklistItemDescription = 'Frame damaged' 

Это приводит к логическому значению: есть ChecklistItemDescription с "Кадр" dameged строковое значение (TRUE) или нет (FALSE).

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

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

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

+0

+1 для метода Беккера. – Flack

1

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

<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() необходимо изменить, чтобы отразить ури вспомогательного документа.

+0

+1. Подобно boolean-> числовым преобразованиям. – Flack