我正在尝试在XSLT上做一些练习,这是我的第一次xslt尝试:
我有以下 xml 作为我的输入
<?xml version="1.0" encoding="UTF-8"?>
<root>
<elementA>
<elementB attB="valueb">
<elementC attC="c-value">
what I want
</elementC>
</elementB>
<elementB attB="valueb">
</elementB>
</elementA>
</root>
以及以下 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:template match="/root/elementA">
<newElement>
<xsl:for-each select="elementB[@attB='valueb']">
<valuef>
<xsl:for-each select="./elementC">
<xsl:value-of select=".">
</xsl:value-of>
</xsl:for-each>
</valuef>
</xsl:for-each>
</newElement>
</xsl:template>
</xsl:stylesheet>
我得到的转换后的 xml 是:
<newElement>
<valuef>
what I want
</valuef>
<valuef/>
</newElement>
我想摆脱空的(valuef)标签(这些标签是由于elementB没有elementC作为孩子而创建的)。
我哪里做错了?
谢谢!
如果要
将每个elementC
映射到valuef
,则可以简单地使用
<xsl:for-each select="elementB[@attB='valueb']/elementC">
<valuef>
<xsl:value-of select="."/>
</valuef>
</xsl:for-each>
输入的方式
<?xml version="1.0" encoding="UTF-8"?>
<root>
<elementA>
<elementB attB="valueb">
<elementC attC="c-value">
what I want
</elementC>
</elementB>
<elementB attB="valueb">
</elementB>
</elementA>
</root>
输出为
<newElement>
<valuef>
what I want
</valuef>
</newElement>
请参阅 http://xsltransform.net/pPJ8LVC/1。