输入xml:
<sb:pages>
<sb:first-page>
461
</sb:first-page>
<sb:last-page>
70
</sb:last-page>
</sb:pages>
<sb:pages>
<sb:first-page>
461
</sb:first-page>
</sb:pages>
我的输出xml:
<sb:pages>
<sb:first-page>461</sb:first-page>
<sb:last-page>70</sb:last-page>
</sb:pages>
<sb:pages>
<sb:first-page>461</sb:first-page>
<sb:last-page/>
</sb:pages>
我不想要我的输出xml中的第二页。因为sb:pages [last()] / sb:last-page不在我的输入xml中。 我在我的xslt中使用for-each循环。我需要做什么来获得没有空标记的输出xml?
我的预期输出xml是:
<sb:pages>
<sb:first-page>461</sb:first-page>
<sb:last-page>70</sb:last-page>
</sb:pages>
<sb:pages>
<sb:first-page>461</sb:first-page>
</sb:pages>
有谁帮我解决了这个问题?
我的xslt是:
<xsl:for-each select="/pages/sb:pages"/>
<sb:first-page><xsl:value-of select="normalize-space(sb:first-page)"/>
</sb:first-page>
<sb:last-page><xsl:value-of select="normalize-space(sb:last-page)"/>
</sb:last-page>
</xsl:for-each>
答案 0 :(得分:1)
这不是删除空元素的问题,而是关于不首先添加它们的问题。解决方案是使用&#34; push&#34;接近而不是&#34;拉&#34;做法。
替换它:
<xsl:for-each select="/pages/sb:pages"/>
<sb:first-page><xsl:value-of select="normalize-space(sb:first-page)"/>
</sb:first-page>
<sb:last-page><xsl:value-of select="normalize-space(sb:last-page)"/>
</sb:last-page>
</xsl:for-each>
有了这个:
<xsl:apply-templates select="/pages/sb:pages" />
并添加以下模板:
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(*)]/text()">
<xsl:value-of select="normalize-space()" />
</xsl:template>
这是一种通用方法,可以规范所有文本节点中与其他模板不匹配的空间。