我敢打赌这是一个简单的问题。
我试图用XSL设置我的xml文件样式。我想要做的是当我的XML文件中缺少一个元素时,我希望xsl输出“Missin Element”
我设法创建一个字符串,表示元素中没有数据,但是当我在元素中没有任何数据但该元素仍然存在时。
我粘贴我的xml文件以解释更好的
<autoads>
<ad>
<type>1</type>
<name>Honda</name>
<model>XL 1000 V</model>
<regyear>2001</regyear>
<price>129900</price>
<adtext>2001 Honda XL 1000 V, 8.900 km. hög vindruta. Pris 129.900kr,-. </adtext>
<addate>20020115</addate>
<volume>1000</volume>
</ad>
<ad>
<type>2</type>
<name>Nissan</name>
<model>Almera 1.4S</model>
<regyear>1997</regyear>
<price>119000</price>
<adtext>1997 Nissan Almera 1.4S, 5 dörrar, met, 70.000 km. el.spegel/fönster, galv. kaross, c.lås, startspärr, airbag, nedfällb. baks. ABS, ute temp. R/CD, alarm, d.fäste, v.säten, s/v-hj. EU-godk. full service, servo. Pris 119.000 kr,-. </adtext>
<addate>20020118</addate>
<volume>0</volume>
<category>5 dörrar</category>
</ad>
</autoads>
如您所见,第一个元素类别缺失,
这就是我试图用xsl字符串输出的内容,它应该打印出“类别丢失”
感谢您的帮助。
答案 0 :(得分:1)
您需要指定您期望的元素并测试它们的存在。在最简单的情况下,使用这样的东西:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ad">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:if test="not(category)">
<xsl:comment>category is missing</xsl:comment>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这会输出注释来代替缺失的节点,但您可以轻松修改它以输出元素或只是文本。
要获得更完整的解决方案,请创建所需元素的列表,并使用document
函数验证此列表中每个项目是否存在:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:m="m">
<xsl:output method="xml" indent="yes"/>
<m:req>type</m:req>
<m:req>name</m:req>
<m:req>model</m:req>
<m:req>regyear</m:req>
<m:req>price</m:req>
<m:req>adtext</m:req>
<m:req>addate</m:req>
<m:req>volume</m:req>
<m:req>category</m:req>
<xsl:variable name="required" select="document('')/*/m:req"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ad">
<xsl:variable name="this" select="."/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="$required">
<xsl:variable name="search"
select="$this/*[name()=current()]"/>
<xsl:if test="$search">
<xsl:apply-templates select="$search"/>
</xsl:if>
<xsl:if test="not($search)">
<xsl:comment>
<xsl:value-of select="concat(., ' is missing')"/>
</xsl:comment>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>