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

时间:2017-01-09 10:26:51

标签: xml xslt-1.0

我正在尝试在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作为子节点而创建)。

我在哪里做错了?

谢谢!

1 个答案:

答案 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>

请参阅http://xsltransform.net/pPJ8LVC/1