0

我创建了以下 XML 文件

<MainTag>
     <MainSubTag>
       <Tag1>Value1</Tag1>
        <Tag2>Value2</Tag2>
     </MainSubTag>
</MainTag>
<MainTag>
     <MainSubTag>
        <Tag1>Value1</Tag1>
        <Tag2>Value2</Tag2>
     </MainSubTag>
</MainTag>

预期输出:

<MainTag>
     <MainSubTag>
        <Tag2>Value2</Tag2>
     </MainSubTag>
     <MainSubTag>
        <Tag2>Value2</Tag2>
     </MainSubTag>
</MainTag>

我尝试了以下 XSLT

   <?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" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/MainTag">
    <MainTag>
<xsl:for-each select="MainSubTag">
    <MainSubTag>
    <xsl:apply-templates select="./*[not(name()='Tag1')]"/>
    </MainSubTag>
</xsl:for-each>
    </MainTag>
</xsl:template>

<xsl:template match="MainSubTag">
    <MainSubTag>
        <xsl:apply-templates select="./@*[not(name()='Tag1')]"/>
    </MainSubTag>
</xsl:template>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

    </xsl:stylesheet>

但它不起作用。它抛出错误

致命:Xalan 致命错误 预期的注释或处理指令

4

1 回答 1

1

我假设,正如其他人所提到的,您的 XML 输入中应该有一个根元素(没有它,转换将失败,如您所见)。

给定以下 XML:

<RootElement>
  <MainTag>
     <MainSubTag>
      <Tag1>Value1</Tag1>
      <Tag2>Value2</Tag2>
    </MainSubTag>
  </MainTag>
  <MainTag>
    <MainSubTag>
      <Tag1>Value1</Tag1>
      <Tag2>Value2</Tag2>
    </MainSubTag>
  </MainTag>
</RootElement>

这个 XSL 样式表:

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

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

  <!-- Don't show the RootElement in the output. -->
  <xsl:template match="RootElement">
    <xsl:apply-templates/>
  </xsl:template>

  <!-- When we output the first MainTag element, find all the elements at
       the same depth as its children (e.g. elements under other MainTag
       elements) and process with them. -->
  <xsl:template match="MainTag[position() = 1]">
    <xsl:copy>
      <xsl:apply-templates select="(following-sibling::* | self::*)/*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Only output the first MainTag element. -->
  <xsl:template match="MainTag[position() != 1]"/>

  <!-- Don't output Tag1 elements. -->
  <xsl:template match="Tag1"/>

</xsl:stylesheet>

生成所需的 XML:

<MainTag>
   <MainSubTag>
      <Tag2>Value2</Tag2>
   </MainSubTag>
   <MainSubTag>
      <Tag2>Value2</Tag2>
   </MainSubTag>
</MainTag>
于 2013-07-25T22:42:35.253 回答