XSLT重命名混合内容中的子节点

时间:2016-11-09 15:20:12

标签: xml xslt

我有这个结构

<root>
  <parent>BLA<child>BLI</child>BLU</parent>
</root>

我想得到这个输出

<root>
  <A_PARENT>BLA<A_CHILD>BLI</A_CHILD>BLU</A_PARENT>
</root>

我已经让父母成为A_PARENT,但由于parent可以托管混合内容,我无法将parent的文字内容复制到同一个内容中无论重叠程度如何,时间都要重新命名。

我可以在这里展示XSL代码,但是没有任何模板可以让我与预期的足够接近,值得分享。

任何提示?

2 个答案:

答案 0 :(得分:2)

无需转换混合内容的特殊规定......

身份转换的简单应用

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

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

  <xsl:template match="parent">
    <A_PARENT>
      <xsl:apply-templates/>
    </A_PARENT>
  </xsl:template>

  <xsl:template match="child">
    <A_CHILD>
      <xsl:apply-templates/>
    </A_CHILD>
  </xsl:template>

</xsl:stylesheet>

应用于您的输入XML,

<root>
  <parent>BLA<child>BLI</child>BLU</parent>
</root>

产生此输出XML

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <A_PARENT>BLA<A_CHILD>BLI</A_CHILD>BLU</A_PARENT>
</root>
根据要求

答案 1 :(得分:1)

这里有两项任务。一种是通过对模板应用模板对节点进行基本的,每天一次的XSLT迭代。另一个是元素的动态命名。

试试这个:

<xsl:template match="/">
    <root>
        <xsl:apply-templates select='root/*' />
    </root>
</xsl:template>
<xsl:template match='*'>
    <xsl:element name='A_{translate(name(), "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")}'>
        <xsl:apply-templates select='*' />
    </xsl:element>
</xsl:template>

奇怪的translate(...行是在XSLT 1中转换为大写的冗长方式。

您可以在this XMLPlayground看到演示(点击“输出”标签查看生成的代码。)

请注意,我已经采用了一种约定 - 即,任何级别的所有标签都应转换为大写并以“A _”为前缀。