【问题标题】:XML to XML with XSLT- Add, Remove, Modify Elements and AttributesXML to XML with XSLT - 添加、删除、修改元素和属性
【发布时间】:2012-07-20 18:43:47
【问题描述】:

我想使用 XSLT 从一个 XML (XHTML) 文件更改为另一个。在新的 XML 文件中,我必须删除/添加/修改一些元素。因此,为此我创建了一个identity.xsl 文件,它复制了整个源文件,然后我创建了一个包含identity.xsl 的新XSLT,然后在那个新XSLT 中我尝试进行修改。我可以通过传递一个模板匹配来消除一些不需要的属性,该模板匹配什么都不做,但我无法在现有标签中添加新属性,也无法在特定位置添加新元素(在特定位置带有结束标签)。

我的原始文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-type" content="text/html;  charset=utf-8" />
</head>

<body>
  <div id="o">
    <div id="nd">
      <p>1</p>
    </div>

    <div class="TF id="id12">
      <element1 name="abc" src="abc.jpg"></script>
      <input type="radio" id="1" event="xyz">
      <div class="q">
        <br/>
        <div id="ta3" class="block">
          <span style="a">ABC</span>
        </div>
        <br/>T <input/> F <input/>
        <div id="sf">
          <div id="ta3">
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
</body>
</html>

所需文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-type" content="text/html;  charset=utf-8" />
</head>

<!--HAVE TO AD THESE TWO ELEMENTS-->
<element add="xyz" id="23">
<element add="xyz" id="24">

<!--ADD ATTRIBUTES IN BODY TAG-->
<body onLoad="ada" bgcolor="pink">

  <div id="o">
    <div id="nd">
      <p>1</p>
    </div>

    <div class="TF id="id12">

      <!--HAVE TO UPATE THE VALUE OF SRC ATTRIBUTE -->
      <element1 name="abc" src="xyz.jpg"></script>

      <!--ADD THIS FORM ELEMENT WITH ATTRIBUTE-->
      <form name="form">
        <input type="radio" id="1" event="xyz">
        <div class="q">
          <br/>
          <div id="ta3" class="block">
            <span style="a">ABC</span>
          </div>

          <br/>T 
          <!--ADD TABLE/TR/TD TAG-->
          <table>
            <tr>
              <td>
                <input/>
              </td>
            </tr>
            <tr>
              </td>
              F <input/>
              </td>
            </tr>
          </table>

          <div id="sf">
            <div id="ta3">
            </div>
          </div>
        </div>

        <!--ADD INPUT TAG-->
        <input type="submit" value="Done"/>

      </div>
    </div>

    <!--CLOSE FORM TAG-->
  </form>
</div>
</body>
</html>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Import the identity transformation. -->
  <xsl:import href="identity.xsl"/>

  <xsl:template match="body">
    <body>
      <xsl:apply-templates select="body">
      </xsl:apply-templates>
    </body>
  </xsl:template>

  <xsl:template match="body">
    <body onLoad="ada" bgcolor="pink"></body>
  </xsl:template>

  <!--REMOVES THE MATCHING ATTRIBUTE and DOES THE JOB-->
  <xsl:template match="@attr"> </xsl:template>

  <xsl:template match="input">
    <xsl:element name="input">
      <xsl:attribute name="type">submit</xsl:attribute>
      <xsl:attribute name="value">Done</xsl:attribute>
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

【问题讨论】:

  • 您能更具体地说明您遇到的问题吗?
  • @Michael 我无法添加具有属性的新元素并向现有元素添加新属性。但是,我可以删除/更新属性。例如 - 我必须在 head 标签之后添加两个元素并向 body 标签添加新属性,但我不能这样做。
  • 您输入的 XML 有一些错误。例如脚本标签不平衡。请更正,以便我们了解您的意图。
  • RahuID,在我修复您的格式时,我可以清楚地告诉您,您的 XML 输入完全无效。也许你想修复它?

标签: xml xslt xhtml


【解决方案1】:

就我个人而言,我无法忍受 XSL-T。太难读了。

我的偏好是创建我想要生成的 XML 的 Velocity 模板,并使用 Velocity 从旧的 XML 映射到新的 XML。它更容易可视化并且效果也很好。

【讨论】:

  • 感谢您的回复。对不起,我是 XSLT 的新手,所以我不知道 XML 的 Velocity 模板。你能建议我怎么做吗?
  • 查看超链接并开始阅读如何使用 Velocity。这相对容易。
【解决方案2】:

您的输入文档中充满了格式错误,我不得不冒险猜测您的意图。请参阅下面的转换解决方案。我故意没有在您的评论“添加表格/TR/TD TAG”周围插入表格元素,因为这部分看起来很疯狂,以至于我在这里为您提供的任何解决方案都可能是对您所需规则的错误解释转型。

这个 XSLT 1.0 样式表 ...

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

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

<xsl:template match="xhtml:body">
  <element add="xyz" id="23" />
  <element add="xyz" id="24" />
 <body onLoad="ada" bgcolor="pink">
  <xsl:apply-templates select="@*|node()"/>
  </body>
</xsl:template>

<xsl:template match="xhtml:element1[@name='abc']/@src">
  <xsl:attribute name="src">xyz.jpg</xsl:attribute>  
</xsl:template>

<xsl:template match="xhtml:input[@id='1']">
  <form name="form">
   <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
   <xsl:apply-templates select="following-sibling::xhtml:div[1]" mode="inside-form"/> 
  </form>
</xsl:template>

<xsl:template match="xhtml:div[ preceding-sibling::xhtml:*[1]
   /self::xhtml:input[@id='1']]"/>

<xsl:template match="xhtml:div" mode="inside-form">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
 <input type="submit" value="Done"/> 
</xsl:template>

</xsl:stylesheet>

... 将采用此输入文档...

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-type" content="text/html;  charset=utf-8" />
</head>
<body>
 <div id="o">
  <div id="nd">
   <p>1</p>
  </div>
  <div class="TF" id="id12">
   <element1 name="abc" src="abc.jpg"/>
   <input type="radio" id="1" event="xyz"/>
   <div class="q">
    <br/>
    <div id="ta3" class="block">
     <span style="a">ABC</span>
    </div>
    <br/>T <input/> F <input/>
    <div id="sf">
     <div id="ta3">
     </div>
    </div>
   </div>
  </div>
 </div>
</body>
</html>

...并生成此输出文档...

<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-type" content="text/html;  charset=utf-8" />
  </head>
  <element add="xyz" id="23" />
  <element add="xyz" id="24" />
  <body onLoad="ada" bgcolor="pink">
    <div id="o">
      <div id="nd">
        <p>1</p>
      </div>
      <div class="TF" id="id12">
        <element1 name="abc" src="xyz.jpg" />
        <form name="form">
          <input type="radio" id="1" event="xyz" />
          <div class="q">
            <br />
            <div id="ta3" class="block">
              <span style="a">ABC</span>
            </div>
            <br />T <input /> F <input /><div id="sf"><div id="ta3" /></div></div>
          <input type="submit" value="Done" />
        </form>
      </div>
    </div>
  </body>
</html>

【讨论】:

  • @SeanBDurkin 非常感谢您的回复。我会按照你说的方法做。再次感谢。
  • 非常感谢它完美运行。现在我可以尝试一些修改。 :)
  • 我有一个问题。就像在上面的源 XHTML 中一样,有一个 - ,而在我的完整源文件中我还有一个像 和一个像 这样的 'head' 标签内,所以当我应用上面的 XSLT 时,它会在任何地方改变 source 的值并使它是 xyz.jpg,而我只需要更改 src="abc.jpg" 的位置。那么你能告诉我我怎样才能做到这一点吗?谢谢!
  • 我尝试过这样的事情-
  • 嗨拉胡尔。请将您的问题作为另一个问题发布。我和其他人会看的。为获得最佳结果,请提供示例输入、预期输出、XSLT 版本(1.0 或 2.0)和转换规则。还要确保 xml 列表格式正确且没有错误。我期待看到你的新问题。
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多