我有这个XML:
<wd:Report_Data xmlns:wd="urn:com.workday.report/INT005_">
<wd:Report_Entry>
<wd:AREA>Comp1</wd:AREA>
<wd:TOP>Dept1</wd:TOP>
<wd:NUMBER>1234567890</wd:NUMBER>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:AREA>Comp2</wd:AREA>
</wd:Report_Entry>
</wd:Report_Data>
和XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="wd"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:wd="urn:com.workday.report/INT005_">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*" />
<xsl:template match="wd:Report_Data">
<wd:Report_Data>
<xsl:for-each select="wd:Report_Entry">
<wd:Report_Entry>
<wd:AREA><xsl:value-of select="wd:AREA"/></wd:AREA>
<wd:TOP>
<xsl:choose>
<xsl:when test="wd:TOP=''">
<xsl:value-of select="wd:AREA"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="wd:TOP"/></xsl:otherwise>
</xsl:choose>
</wd:TOP>
<wd:NUMBER><xsl:value-of select="wd:NUMBER"/></wd:NUMBER>
</wd:Report_Entry>
</xsl:for-each>
</wd:Report_Data>
</xsl:template>
</xsl:stylesheet>
条件是: 1.当没有wd:NUMBER时,元素wd:NUMBER应保留在输出文件中(正确设置) 2.当wd:TOP不为空时,只需复制值(正确设置) 3.当wd:TOP不存在时,复制wd的值:AREA(这是问题)
所以期望的输出是:
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/INT005_">
<wd:Report_Entry>
<wd:AREA>Comp1</wd:AREA>
<wd:TOP>Dept1</wd:TOP>
<wd:NUMBER>1234567890</wd:NUMBER>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:AREA>Comp2</wd:AREA>
<wd:TOP>Comp2</wd:TOP>
<wd:NUMBER/>
</wd:Report_Entry>
</wd:Report_Data>
我应该怎么做条件3?提前谢谢!
答案 0 :(得分:1)
完全检测节点是否存在:
<xsl:if test="Node">
并且类似地缺少节点的测试是:
<xsl:if test="not(Node)">
我认为你对条件3的要求是
<xsl:if test="not(wd:TOP)">
<xsl:value-of select="wd:AREA"/>
</xsl:if>
看起来你想要空的或遗失wd:TOP
的结果相同,所以:
<wd:TOP>
<xsl:choose>
<xsl:when test="wd:TOP='' or not(wd:TOP)">
<xsl:value-of select="wd:AREA"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="wd:TOP"/>
</xsl:otherwise>
</xsl:choose>
</wd:TOP>
通常情况下,您可能需要测试的另一个条件是nil
,这需要检查:
wd:TOP/@xsi:nil = 'true'