2011-01-24 83 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,有可能是我赢了“T有任何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。 – 2011-01-24 19:16:27

+0

好问题,+1。查看我的答案,获取完整而简短的解决方案。 :) – 2011-01-24 20:53:44

回答

1

这个XPath表达式

/InspectionChecklist 
    /InspectionChecklistItem 
     /ChecklistItemDescription = 'Frame damaged' 

它导致布尔值:有一个与ChecklistItemDescription “帧dameged” 字符串值(true)或否(false)。

我们可以通过这个表达式(间等)将此转换为YN

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

我离开你组成一个锻炼你。

+0

+1为贝克尔的方法。 – Flack 2011-01-24 20:59:03

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()函数调用以反映辅助文档的URI。