xslt映射

时间:2011-01-24 19:14:18

标签: xml xslt

我有一个包含以下值的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 个答案:

答案 0 :(得分:1)

此XPath表达式

/InspectionChecklist
   /InspectionChecklistItem
      /ChecklistItemDescription = 'Frame damaged' 

它产生布尔值:有一个ChecklistItemDescription带有“Frame dameged”字符串值(true)或不带(false)。

我们可以通过此表达式(在其他人之间)将此转换为YN

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

我把作文作为练习留给你。

答案 1 :(得分: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。