0

尝试从根元素中移动直接子元素,然后将它们复制到新的根元素下。能够做到这一点一个子元素,但不知道如何应用orwith inselect语句。
递归子元素的当前 XSLT:

<xsl:template match="Element1">
    <Information>
      <xsl:apply-templates select="*[name()!='Element1']"/>
    </Information>
    <xsl:apply-templates select="Element1"/>
  </xsl:template>
  <xsl:template match="Element1/Element1">
    <Metadata>
      <xsl:apply-templates/>
    </Metadata>
  </xsl:template>

我想对另一个子元素应用相同的内容并尝试过

<xsl:template match="Element1">
    <Information>
      <xsl:apply-templates select="*[name()!='Element1'] | *[name()!='Element2']"/>
    </Information>
    <xsl:apply-templates select="Element1"/>
  </xsl:template>
  <xsl:template match="Element1/Element1">
    <Metadata>
      <xsl:apply-templates/>
    </Metadata>
  </xsl:template>

  <xsl:template match="Element1/Element2">
    <Metadata2>
      <xsl:apply-templates/>
    </Metadata2>
  </xsl:template>

但它没有用。请帮忙。

4

2 回答 2

1

您可能想尝试将这些模板放入一个组中,并使用一个空模板来删除您不想要的那些。向应用模板添加模式

<xsl:apply-templates select="*" mode="metadata"/>

激活组,然后在组中定义模板

<xsl:template match="*" mode="metadata"/>
<xsl:template match="Element1" mode="metadata">
  ...
<xsl:template>
<xsl:template match="Element2" mode="metadata">
  ...
<xsl:template>

对于元数据块。


使用一种模式,您的模板将如下所示:

<xsl:template match="Element1">
  <Information>
    <!-- use templates in the information group -->
    <xsl:apply-templates select="*" mode="metadata"/>
  </Information>
  <xsl:apply-templates select="Element1"/>
</xsl:template>

<!-- This template removes unspecified elements -->
<xsl:template match="*" mode="metadata"/>

<xsl:template match="Element1" mode="metadata">
  <Metadata>
    <xsl:apply-templates/>
  </Metadata>
</xsl:template>

<xsl:template match="Element2" mode="metadata">
  <Metadata2>
    <xsl:apply-templates/>
  </Metadata2>
</xsl:template>

您可能还有一些其他模板定义 和 的<Metadata/>内容<Metadata2/>。那些可能也应该处于模式中。

于 2013-10-11T15:23:57.933 回答
0
<xsl:apply-templates select="*[name()!='Element1'] | *[name()!='Element2']"/>

... 对于 Element1 和 Element2 始终为真 - 您不能像这样将两个 != 表达式链接在一起,因为该表达式将对所有内容计算为真。

您可以简单地将 Element1/Element1 和 Element1/Element2 路径与不输出任何内容的模板匹配 - 然后您不必在里面的 apply-templates 表达式中有复杂的逻辑。

然后从您的根调用一个命名模板(而不是使用匹配)以输出您希望它去的 Element1/Element1。

于 2013-10-11T15:10:02.113 回答