动态更改元素名称XSLT 1.0

时间:2017-10-06 15:11:36

标签: xml xslt xpath

我需要使用xslt更改xml文件。要求是我应该将结构简化为单个节点,其中包含从xml中获取的元素列表,其中一些元素更改名称。

我设法让xslt只返回我想要返回的字段,但我不知道如何改变结果xml的结构,以便所有字段都列在{{1的单个元素中等级。以下是一些示例xml:

<Item>

我有以下xslt:

<MyData>
<BigGroups>
  <BigGroup>
    <Id>100</Id>
    <LittleGroups>
      <LittleGroup>
        <Id>10</Id>
        <Items>
          <Item>
            <ItemId>1</ItemId>
            <Foo>
              <This>Here This is</This>
              <That>That is here</That>
            </Foo>
            <Bar>
              <Camp>
                <Another>Look Another one</Another>
              </Camp>
              <More>Oh god; more</More>
            </Bar>
          </Item>
          <Item>
            <ItemId>2</ItemId>
            <Foo>
              <This>Here This is</This>
              <That>That is here</That>
            </Foo>
            <Bar>
              <Camp>
                <Another>Look Another one</Another>
              </Camp>
              <More>Oh god; more</More>
            </Bar>
          </Item>
        </Items>
      </LittleGroup>
      <Id>20</Id>
      <!--Items, Item, Foo, Bar etc-->
    </LittleGroups>
    <!--More Little Groups maybe-->
  </BigGroup>
</BigGroups>
</MyData>

只保留我想要的字段,但现在我需要将输出转换为基本上每个项目计算一组元素,所有子元素在同一级别 - 看起来像这样:

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

  <Translate:Fields>
    <Field>
      <OldName>This</OldName>
      <NewName>NEW_This</NewName>
    </Field>
    <Field>
      <OldName>ItemId</OldName>
    </Field>
    <Field>
      <OldName>Another</OldName>
    </Field>
  </Translate:Fields>

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

  <xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/Translate:Fields/Field/OldName])]">
  </xsl:template> 
</xsl:stylesheet>

我完全不知道如何更改结构,以便所有字段都在一个元素中,在本例中按Item分组。环顾四周,关于重命名元素的所有示例案例似乎都假设您可以将旧名称和新名称硬编码到xslt中(如此How to replace a node-name with another in Xslt?),但我特别需要使用旧字段和新字段列表如上例所示的名称。

我可以使用translate来查找经过多次搜索后要包含的字段,但我似乎无法使用<MyData> <Item> <ItemId>1</ItemId> <NEW_This>Here This is</NEW_This> <Another>Look Another one</Another> </Item> <Item> <ItemId>2</ItemId> <NEW_This>Here This is</NEW_This> <Another>Look Another one</Another> </Item> </MyData> 值更新元素(我一直在使用<NewName>类型位,但它似乎总是添加新字段,而不是替换名称。任何帮助都将非常感谢!

1 个答案:

答案 0 :(得分:0)

这是你可以看到它的一种方式:

XSL 1.0

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

<!-- keep these -->
<xsl:template match="MyData | Item | ItemId | Another">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<!-- rename this -->
<xsl:template match="This">
    <NEW_This>
        <xsl:apply-templates/>
    </NEW_This>
</xsl:template>

<!-- suppress other leaf nodes -->
<xsl:template match="*[text()]" priority="0"/>

</xsl:stylesheet>