使用XSL在XML中使用多个节点的问题

时间:2014-04-12 05:37:51

标签: xml xslt

如果存在“Name1”的节点,并且如果节点“Name1”不存在,并且如果整个数据节点不存在,则我想添加新关键字,然后添加整个预定义部分,如下所示:

<Data>
<Keyword>Keyword1</keyword>
<Name>Name1</Name>
<Data>

For Above我在XSL中使用以下逻辑:

<xsl:param name="AddKeywords">
    <!-- Predefine Structure for Add Keyword -->
</xsl:param>

    <xsl:template
        match="data/[Name='Name1']/keyword[position()=last()]">
        <xsl:copy-of select="$AddKeywords"/>`
    </xsl:template>

    <xsl:param name="AddDataSection">
        <!-- Predefine Structure to Add Whole New Data Section -->
    </xsl:param>

    <xsl:template
        match="data/[Name!='Name1'][position()=last()]">
        <xsl:copy-of select="$AddDataSection"/>
    </xsl:template>

现在的问题是文档中有多个数据部分,所以如果在第一部分中找到Name1,那么新的关键字是add,但之后还有多个数据节点不存在Name1数据,所以它在第一个数据部分添加关键字以及还创建了全新的数据部分,因此重复问题出现了。因此,两个模板都是由于多个数据部分而执行的。

那么问题是什么?

1 个答案:

答案 0 :(得分:0)

我不是100%清楚你在问什么,但这可能就是你所追求的。

  • “如果Data元素包含带有文字Name的子Name1元素,那么会将一些常量关键字附加到现有Keywords }孩子。

  • “如果Data元素没有包含文字Name的子Name1元素,则删除Data的所有内容并将其替换为默认值,填充了KeywordName子元素。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml"/>

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

   <xsl:variable name="extraKeywords">,hello,world</xsl:variable>
   <xsl:variable name="missingDataSection">
      <Keyword>SomeDefaultKeywords</Keyword>
      <Name>SomeDefaultName</Name>
   </xsl:variable>

   <xsl:template match="Keyword[ancestor::Data[Name='Name1']]">
      <Keyword>
         <xsl:value-of select="."/>
         <xsl:value-of select="$extraKeywords"/>
      </Keyword>
   </xsl:template>

   <xsl:template match="Data[Name!='Name1']">
      <Data>
         <xsl:copy-of select="$missingDataSection"></xsl:copy-of>
      </Data>
   </xsl:template>

</xsl:stylesheet>

当应用于此Xml时:

<xml>
   <Data>
      <Keyword>Keyword1</Keyword>
      <Name>Name1</Name>
   </Data>
   <Data>
      <Keyword>AnotherKeyword</Keyword>
      <Name>NotName1</Name>
   </Data>
</xml>

产生这个结果:

<?xml version="1.0" encoding="utf-8"?>
<xml>
   <Data>
      <Keyword>Keyword1,hello,world</Keyword>
      <Name>Name1</Name>
   </Data>
   <Data>
      <Keyword>SomeDefaultKeywords</Keyword>
      <Name>SomeDefaultName</Name>
   </Data>
</xml>