0

长期使用本网站,未注册。现在我发现了一个问题,虽然我确信很容易解决,但我在任何搜索中都看不到任何相关材料!

这个xml示例简化了我的问题:

<root_element>
 <content>
  <content-detail>
    <name>TV Show Name</name>
    <value> Father Ted </value>
  </content-detail>

  <content-detail>
    <name>Airing Status</name>
     <value> Cancelled </value>
  </content-detail>

 </content>
</root_element>

在这个完全虚构的示例中,假设我想编写一个 XSL 转换,将泰德父亲更新为“泰德父亲——取消”。

我可以更新所有电视节目名称,但无法让 XSL 理解它应该只在 Airing Status 的值为 Cancelled 时更新 TV Show Name 值元素。

请帮助我已经坚持了几个小时!!!!

4

2 回答 2

0

这会做你想做的

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="value[../name='TV Show Name']">
        <value>
            <xsl:choose>
                <xsl:when test="../../content-detail[name='Airing Status']/value = ' Cancelled '">
                    <xsl:value-of select="."/>- Cancelled
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </value>
    </xsl:template>    
</xsl:stylesheet>

第一个模板是仅将输入复制到输出的“恒等变换”。

第二个模板仅匹配为value的元素。它根据同一块中的值生成一个元素,其文本设置为所需的字符串。nameTV Show NamevalueAiring Status<content>

注意:如果值周围的空白有任何变化,您可能需要调整测试' Cancelled '

于 2013-07-10T16:55:03.533 回答
0

这是一个面向推送的解决方案,在模板匹配方面更简单一些,并且可以在您的值周围使用任意数量的空格:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>

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

  <xsl:template
    match="content[content-detail
             [normalize-space(name) = 'Airing Status']
             [normalize-space(value) = 'Cancelled']
           ]
           /content-detail[normalize-space(name) = 'TV Show Name']/value">
    <value>
      <xsl:value-of select="concat(normalize-space(), ' -- CANCELLED')"/>
    </value>
  </xsl:template>

</xsl:stylesheet>
于 2013-07-10T17:59:30.853 回答