<xsl:if test =“”>未按预期工作</xsl:if>

时间:2014-11-11 13:21:39

标签: xml xslt

我是XSLT的新手。我有以下XML我尝试从中提取字符串。但是我必须确保没有空字符串,因为接收应用程序不允许空字段。因此,在源XML在描述字段中没有值的情况下,该字段带有角色属性&#34; descRole:audio&#34;并且紧挨着兄弟节点&#39; itemClass&#39;它具有qcode =&#34; icls:video&#34;的角色属性,我想插入一个空格字符。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<newsMessage xmlns="http://iptc.org/std/nar/2006-10-01/">
    <itemSet>
        <packageItem>
            <itemMeta/>
            <contentMeta/>
        </packageItem>
        <newsItem>
            <itemMeta>
                <itemClass qcode="icls:text"/>
            </itemMeta>
            <contentMeta>
                <description role="descRole:intro" xml:lang="en"></description>                
                <description role="descRole:moreInfo" xml:lang="en"></description>
            </contentMeta>
        </newsItem>
        <newsItem>
            <itemMeta>
                <itemClass qcode="icls:video"/>
            </itemMeta>
            <contentMeta>
                <description role="descRole:audio" xml:lang="en">NATURAL</description>
            </contentMeta>
        </newsItem>
    </itemSet>
</newsMessage>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://iptc.org/std/nar/2006-10-01/" version="1.0">
    <xsl:template match="/">
        <xsl:value-of select="/d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio']"/>
<xsl:if test=".=''"><xsl:text> </xsl:text></xsl:if>
    </xsl:template>
</xsl:stylesheet>

不知怎的,这对我不起作用,我不明白为什么。

2 个答案:

答案 0 :(得分:1)

您的xsl:ifxsl:value-of语句无关......

<xsl:if test=".=''"><xsl:text> </xsl:text></xsl:if>

在这种情况下,.只是引用当前上下文节点,即模板匹配的文档节点,因此xsl:value-of的值不相关。

在这种情况下尝试使用变量:

<xsl:variable name="value" select="/d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio']"/>
<xsl:value-of select="$value" />
<xsl:if test="$value=''"> </xsl:if>

答案 1 :(得分:0)

如果要转换大部分未更改的XML文档,但转换了一些部分,则从身份转换模板开始

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

然后为需要更改的元素添加匹配模式的模板,例如

<xsl:template match="d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio'][. = '']">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:text> </xsl:text>
  </xsl:copy>
</xsl:template>