我有一个包含以下值的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>
我已经做了几个方法,可以让个人工作。但我不能让他们为每一个可能的案件工作。
任何帮助都将不胜感激。
答案 0 :(得分:1)
此XPath表达式
/InspectionChecklist
/InspectionChecklistItem
/ChecklistItemDescription = 'Frame damaged'
它产生布尔值:有一个ChecklistItemDescription
带有“Frame dameged”字符串值(true)或不带(false)。
我们可以通过此表达式(在其他人之间)将此转换为Y
或N
:
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。