0

在下面的 XSLT 中,我正在检查以下内容

  1. 如果元素为空,则替换然后将其替换为另一个元素的值。
  2. 如果该元素的属性为 null,则将其替换为常量值。

1 有效,但 2 无效。

对于 2,我尝试了两件事:

首先,使用xsl:if条件不起作用。它正在添加具有相同节点名称的新节点,而不是向属性插入值。

其次,我尝试使用模板。那也没有用。它完全消除了节点并将属性添加到具有值的父级。

另外,是否有可能以不同的方式或更好的方式来做。

XSLT

  <xsl:template match="//ns0:Cedent/ns0:Party/ns0:Id">
    <xsl:if test="//ns0:Cedent/ns0:Party/ns0:Id = ''">
      <xsl:copy>
        <xsl:value-of select="//ns0:Broker/ns0:Party/ns0:Id"/>
      </xsl:copy>
    </xsl:if>
    <!--<xsl:if test="//ns0:Cedent/ns0:Party/ns0:Id[@Agency = '']">
      <xsl:copy>
        <xsl:attribute name="Agency">Legacy</xsl:attribute>
        <xsl:value-of select="'Legacy'"/>
      </xsl:copy>
    </xsl:if>-->
  </xsl:template>

  <xsl:template match="//ns0:Cedent/ns0:Party/ns0:Id[@Agency = '']">
    <xsl:attribute name="Agency">Legacy</xsl:attribute>
  </xsl:template>

输入

<ns0:Testing>
  <ns0:Cedent>
    <ns0:Party>
      <ns0:Id Agency=""></ns0:Id>
      <ns0:Name>Canada</ns0:Name>
    </ns0:Party>
  </ns0:Cedent>
  <ns0:Broker>
    <ns0:Party>
      <ns0:Id Agency="Legacy">292320710</ns0:Id>
      <ns0:Name>Spain</ns0:Name>
    </ns0:Party>
  </ns0:Broker>
</ns0:Testing>

输出

<ns0:Testing>
    <ns0:Cedent>
      <ns0:Party>
        <ns0:Id Agency="Legacy">292320710</ns0:Id>
        <ns0:Name>Canada</ns0:Name>
      </ns0:Party>
    </ns0:Cedent>
</ns0:Testing>
4

1 回答 1

1
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="some_namespace_uri"
>
  <xsl:output indent="yes" />

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

  <xsl:template match="ns0:Cedent/ns0:Party/ns0:Id[. = '']">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates select="
        ../../following-sibling::ns0:Broker[1]/ns0:Party/ns0:Id/node()
      " />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ns0:Cedent/ns0:Party/ns0:Id/@Agency[. = '']">
    <xsl:attribute name="Agency">Legacy</xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

给你

<Testing xmlns="some_namespace_uri">
  <Cedent>
    <Party>
      <Id Agency="Legacy">292320710</Id>
      <Name>Canada</Name>
    </Party>
  </Cedent>
  <Broker>
    <Party>
      <Id Agency="Legacy">292320710</Id>
      <Name>Spain</Name>
    </Party>
  </Broker>
</Testing>

笔记:

  • 如果您根本不需要<Broker>输出中的元素,请添加一个空模板:

    <xsl:template match="ns0:Broker" />
    
  • 模板中的匹配表达式不需要从根节点开始。

  • 样式表的工作是复制输入,只做一些更改,比如这个,应该总是从标识模板开始。
于 2013-05-04T05:42:00.297 回答