0

输入:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" type="NOIA" xsi:noNamespaceSchemaLocation="sample.xsd">
<id>X17A</id>
<companyName>Foo Bars</companyName>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tincidunt turpis id metus porttitor convallis. Duis ullamcorper magna a est suscipit eget blandit magna ullamcorper. Vivamus sit amet auctor elit.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tincidunt turpis id metus porttitor convallis. Duis ullamcorper magna a est suscipit eget blandit magna ullamcorper. Vivamus sit <url>http://www.google.com/</url> amet auctor elit.</p>
</document>

期望的输出:

<html>
<body>
<h1>Foo Bars Company</h1>
<div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tincidunt turpis id metus porttitor convallis. Duis ullamcorper magna a est suscipit eget blandit magna ullamcorper. Vivamus sit amet auctor elit.</p></div>
<div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tincidunt turpis id metus porttitor convallis. Duis ullamcorper magna a est suscipit eget blandit magna ullamcorper. Vivamus sit <a href="http://www.google.com/">http://www.google.com/</a> amet auctor elit.</p></div>
</body>
</html>

这是我从这张纸上得到的:

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

<xsl:output method="html" indent="yes" version="4.0"/>

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

<xsl:template match="id"></xsl:template>

<xsl:template match="companyName">
<h1><xsl:value-of select="."/></h1>
</xsl:template>

<xsl:template match="url">
<a href="#test"><xsl:value-of select="."/></a>
</xsl:template>

<xsl:template match="p">
<div><p><xsl:value-of select="."/></p></div>
</xsl:template>

</xsl:stylesheet>

我不知道如何将值放入 href=""

另外,这不会以href结尾,我只是在p中获取文本。

4

1 回答 1

1

当这个 XSLT:

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

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

  <xsl:template match="url">
    <a href="{.}">
      <xsl:apply-templates />
    </a>
  </xsl:template>

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

  <xsl:template match="id" />

  <xsl:template match="companyName">
    <h1>
      <xsl:value-of select="concat(., ' Company')" />
    </h1>
  </xsl:template>

  <xsl:template match="p">
    <div>
      <p>
        <xsl:apply-templates />
      </p>
    </div>
  </xsl:template>
</xsl:stylesheet>

...应用于最初提供的 XML:

<?xml version="1.0" encoding="utf-8"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
type="NOIA" xsi:noNamespaceSchemaLocation="sample.xsd">
  <id>X17A</id>
  <companyName>Foo Bars</companyName>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis
  tincidunt turpis id metus porttitor convallis. Duis ullamcorper
  magna a est suscipit eget blandit magna ullamcorper. Vivamus sit
  amet auctor elit.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis
  tincidunt turpis id metus porttitor convallis. Duis ullamcorper
  magna a est suscipit eget blandit magna ullamcorper. Vivamus sit 
  <url>http://www.google.com/</url>amet auctor elit.</p>
</document>

...产生了预期的结果:

<html>
  <body>
    <h1>Foo Bars Company</h1>
    <div>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
      Duis tincidunt turpis id metus porttitor convallis. Duis
      ullamcorper magna a est suscipit eget blandit magna
      ullamcorper. Vivamus sit amet auctor elit.</p>
    </div>
    <div>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
      Duis tincidunt turpis id metus porttitor convallis. Duis
      ullamcorper magna a est suscipit eget blandit magna
      ullamcorper. Vivamus sit 
      <a href="http://www.google.com/">
      http://www.google.com/</a>amet auctor elit.</p>
    </div>
  </body>
</html>

请注意,此解决方案适用于 XSLT 1.0 或 XSLT 2.0。

解释:

  • 第一个模板是The Identity Transform. 其目的是将所有节点和属性按原样从源文档复制到结果文档。

  • 第二个模板匹配<url>文档中找到的任何元素。找到一个<url>元素后,将创建一个新<a>元素,给定一个与元素href的原始值匹配的属性<url>(通过 XSLT 的AVT [Attribute Value Template]功能),并给定一个与该原始值匹配的<url>值。

<url>请注意,如果需要以同样的方式替换其他元素,您可以match根据需要简单地更改第二个模板的属性。例如:

<xsl:template match="url|some-other-element|yetAnotherElement">
  • 第三个模板匹配任何<id>元素,并且代替该元素,不输出任何内容(这实际上删除了该元素)。

  • 第四个模板匹配任何<companyName>元素。取而代之的是一个新<h1>元素被创建并被赋予一个值,该值是<companyName>'s 值和 "Company" 的串联。

  • 第五个模板匹配任何<p>元素并将其包装在一个<div>元素中。

于 2012-10-10T21:47:36.167 回答