0

在我的源 XML 中,我将所有实例 ID 从数字 1 重新分配到以后(直到存在)。我正在使用 Profile 元素下的上述值更新 Apple、Mango、Banana InstanceId。在这里,我忽略了 Profile InstanceID 级别的出现。我的要求是仅当给定一组“配置文件”中的至少一个实例 ID 大于 25 时才触发这些 xslt 代码。

<Root>
  <Properties>
    <Props></Props>
    <Input></Input>
    <Profile InstanceID="4" ObjectID="XYZ">
      <foo>Profile 1</foo><!-- Need to update these set as atleast one instanceID is greater than 25 -->
      <Apple InstanceID="26" ObjectID="ABC" Type="103"></Apple>
      <Mango InstanceID="1" ObjectID="DEF" Type="103"></Mango>
      <Mango InstanceID="27" ObjectID="GHI" Type="103"></Mango>
      <Banana InstanceID="29" ObjectID="GHI1" Type="103"></Banana>
    </Profile>
  </Properties>
  <Properties>
    <Props></Props>
    <Input></Input>
    <Profile InstanceID="4" ObjectID="XYZ">
      <foo>Profile 1</foo><!-- no need to update these set as no instanceID is greater than 25 -->
      <Apple InstanceID="21" ObjectID="MNO" Type="103"></Apple>
      <Mango InstanceID="21" ObjectID="PQR" Type="103"></Mango>
      <Mango InstanceID="23" ObjectID="EFG" Type="103"></Mango>
      <Mango InstanceID="24" ObjectID="EFG123" Type="103"></Mango>
      <Banana InstanceID="25" ObjectID="GHI1" Type="103"></Banana>
    </Profile>
  </Properties>
</Root>

下面是我使用的 XSLT

# XSLT #
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        exclude-result-prefixes="msxsl">
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Profile/*/@InstanceID">
    <xsl:attribute name="InstanceID">
      <xsl:value-of select="count(../preceding-sibling::*[@InstanceID]) + 1" />
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

这些是输出/转换后的 XML

# Transformed XML #
<Root>
  <Properties>
    <Props></Props>
    <Input></Input>
    <Profile InstanceID="4" ObjectID="XYZ"><!-- no need to update these instanceID -->
      <foo>Profile 1</foo>
      <Apple InstanceID="1" ObjectID="ABC" Type="103"></Apple>
      <Mango InstanceID="2" ObjectID="DEF" Type="103"></Mango>
      <Mango InstanceID="3" ObjectID="GHI" Type="103"></Mango>
      <Banana InstanceID="4" ObjectID="GHI1" Type="103"></Banana>
    </Profile>
  </Properties>
  <Properties>
    <Props></Props>
    <Input></Input>
    <Profile InstanceID="4" ObjectID="XYZ"><!-- no need to update these instanceID -->
      <foo>Profile 1</foo>
      <Apple InstanceID="1" ObjectID="MNO" Type="103"></Apple>
      <Mango InstanceID="2" ObjectID="PQR" Type="103"></Mango>
      <Mango InstanceID="3" ObjectID="EFG" Type="103"></Mango>
      <Mango InstanceID="4" ObjectID="EFG123" Type="103"></Mango>
      <Banana InstanceID="5" ObjectID="GHI1" Type="103"></Banana>
    </Profile>
  </Properties>
</Root>
4

1 回答 1

0

我的要求是仅当给定一组“配置文件”中的至少一个实例 ID 大于 25 时才触发这些 xslt 代码

您只需要使您的Profile/*/@InstanceID模板更加具体。目前它适用于所有InstanceID元素的子元素的属性,您需要在级别添加谓词以将其限制为仅某些配置文件: ProfileProfile

<xsl:template match="Profile[*/@InstanceID &gt; 25]/*/@InstanceID">

这是因为如果集合中的任何节点满足所需条件,则一侧是节点集的比较运算符为真,因此在这种情况下,如果任何子元素的InstanceID值大于 25。

于 2013-10-22T14:38:38.170 回答