0

我想使用 XSLT 从一个 XML (XHTML) 文件更改为另一个。在新的 XML 文件中,我必须删除/添加/修改一些元素。因此,为此我创建了一个identity.xsl文件,它复制了整个源文件,然后我创建了一个新的 XSLT,其中包括identity.xsl然后在那个新的 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>
4

2 回答 2

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>
于 2012-07-22T05:50:27.323 回答
0

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

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

于 2012-07-22T01:34:32.707 回答