导出元素值(如果存在)

时间:2018-02-14 19:43:26

标签: xml xslt

如果element不为空,我想导出http链接。目前我正在使用这个XSLT模板:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>

  <xsl:template match="item">
    <xsl:value-of select="url1" />
    <xsl:text>&#xa;</xsl:text>
    <xsl:value-of select="url2" />
    <xsl:text>&#xa;</xsl:text>
    <xsl:value-of select="url3" /> 
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

示例XML:

<rss>
    <item>
        <name>1</name>
        <url1>http://image1.jpg</url1>
        <url2></url2>
        <url3>http://image3.jpg</url3>
    </item>
    <item>
        <name>2</name>
        <url1>http://image1.jpg</url1>
        <url2></url2>
        <url3></url3>
    </item>
</rss>

一切都很好,除了输出中有一个新行:

http://image1.jpg

http://image3.jpg
http://image1.jpg

有没有办法避免这些新线?目前我使用的是linux工具来删除这些行,但直接在XSLT中进行格式化会很不错。

3 个答案:

答案 0 :(得分:1)

您可以在复制之前检查元素的内容是否空白

<xsl:template match="item">
    <xsl:if test="string-length(url1) > 0">
        <xsl:value-of select="url1" />
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
    <xsl:if test="string-length(url2) > 0">
        <xsl:value-of select="url2" />
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
    <xsl:if test="string-length(url3) > 0">
        <xsl:value-of select="url3" />        
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
</xsl:template>

<强>输出:

http://image1.jpg
http://image3.jpg
http://image1.jpg

或者,如果您想要更广泛一点,请使用以下模板:

<xsl:template match="item">
  <xsl:for-each select="*[starts-with(local-name(),'url')]">
    <xsl:if test="string-length(.) > 0">
        <xsl:value-of select="." />
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

答案 1 :(得分:1)

可以在<xsl:template match="...">内编写其他规则。也许尝试类似的事情:

<xsl:template match="item">
...
</xsl:template>

<xsl:template match="*[not(*) and not(normalize-space())]" />

答案 2 :(得分:1)

请注意,对于XSLT 2或3,如果要输出具有特定分隔符字符串的某些项目,可以使用<xsl:value-of select="select items here" separator="separator string"/>,这样您的意图和建议的代码可以简化为

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text" omit-xml-declaration="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="item">
      <xsl:value-of select="*[starts-with(local-name(), 'url') and normalize-space()]" separator="&#10;"/>
      <xsl:text>&#10;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

http://xsltfiddle.liberty-development.net/bFukv8j