Xml 什么';如果标签存在于XSL中,那么最好的方法是什么?

Xml 什么';如果标签存在于XSL中,那么最好的方法是什么?,xml,xslt,Xml,Xslt,我正在开发一个与第三方应用程序的接口,它基本上需要将应用程序吐出的XML转换成我们的系统可以处理的XML。它基本上只是对原始XML应用样式表,使其看起来像“我们的”XML。我注意到,在我们的其他样式表中,有如下结构: <xsl:for-each select="State"> <StateAbbreviation> <xsl:value-of select="."/> </StateAbbreviation> <

我正在开发一个与第三方应用程序的接口,它基本上需要将应用程序吐出的XML转换成我们的系统可以处理的XML。它基本上只是对原始XML应用样式表,使其看起来像“我们的”XML。我注意到,在我们的其他样式表中,有如下结构:

<xsl:for-each select="State">
    <StateAbbreviation>
        <xsl:value-of select="."/>
    </StateAbbreviation>
</xsl:for-each>

基本上,“in”XML有一个State标记,我需要将其输出为可识别的State缩写标记。但是,我只想在“in”XML包含State标记的情况下输出State缩写标记。上面的块很好地完成了这一点,但不是很直观(至少对我来说不是这样),因为每次我看到每个都有一个
,我假设有多个,而在这些情况下有0或1


我的问题:这是一个标准的ish结构吗?如果没有,是否有更可取的方法?显然,我可以检查字符串长度(其他样式表也在检查),但我希望在任何地方都使用相同的“最佳”方法(当然,假设存在“最佳”方法。建议?建议?

您可以将for each替换为:

<xsl:if test="State">

在XSLT中,建议使用
xsl:apply-templates
而不是
xsl:for-each

在这种情况下,一个简单的

<xsl:apply-templates select="State"/>


以一种最优雅的方式解决了这个问题。不需要任何条件,XSLT处理器做了所有工作来应用与每个
状态
子级最匹配的模板。

我突然想到,您可能还需要将更改为:。哇,这是一个非常明显的答案,我不知道为什么a)最初的开发人员没有这样做,为什么b)我无法自己解决这个问题。我想我今天已经有力地展示了我的XSL新手身份。谢谢你的帮助!谢谢你的回答也帮了我。