我正在尝试在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&#39; s没有将elementC作为子节点而创建)。
我在哪里做错了?
谢谢!
答案 0 :(得分:0)
如果您想将每个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>