仅当标记值为非空时,才使用 for-each 的 XSLT 添加 XML 元素



我正在尝试在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。

相关内容

  • 没有找到相关文章

最新更新