使用xml文档中的Xslt创建锚定

时间:2014-07-19 21:29:37

标签: xml xslt anchor

我正在尝试使用Xslt 1.0从xml文档创建html。在xml文档中,有客户,并且在某些客户的名称属性中有"请参阅XXXX"信息。

这是xml文档;

<?xml version="1.0" encoding="UTF-8"?>
<customers>
    <customer name="Adam Dev" category="A1" phone="1234543" />
    <customer name="Jerry Sngiler (see Matt Pcneiv)" category="" phone="" />
    <customer name="Heid Schwan" category="B1" phone="121257456" />
    <customer name="Matt Pcneiv" category="A2" phone="65656565" />
    <customer name="John Lombak" category="A2" phone="787878787" />
    <customer name="April Ozil (see Heid Schwan)" category="" phone="" />
    <customer name="Terry Hill" category="B1" phone="1212121212" />    
</customers>

我想为&#34; name&#34;创建锚定。属性为xml文档中相关的xml节点,如下所示。我的意思是当用户点击第二个节点上的Matt Pcneiv时,当用户点击6上的Heid Schwan时,页面跳转到4.node.Again上的Matt Pcneiv。节点,页面跳转到3.node上的Heid Schwan。

<html>
<head>
<style>
table,th,td
{
border:1px solid black;
border-collapse:collapse;
}
th,td
{
padding:5px;
}
</style>
</head>
<body>

<table style="width:600px">
<tr>
  <th>Name</th>
  <th>Category</th>     
  <th>Phone</th>
</tr>
<tr>
  <td>Adam Dev</td>
  <td>A1</td>       
  <td>1234543</td>
</tr>
<tr>
  **<td>Jerry Sngiler (see <a href="#C1">Matt Pcneiv</a>)</td>**
  <td></td>     
  <td></td>
</tr>
<tr>
  **<td><a id="C2">Heid Schwan</a></td>**
  <td>B1</td>       
  <td>121257456</td>
</tr>
<tr>
  **<td><a id="C1">Matt Pcneiv</a></td>**
  <td>A2</td>       
  <td>65656565</td>
</tr>
<tr>
  <td>John Lombak</td>
  <td>A2</td>       
  <td>787878787</td>
</tr>
<tr>
  **<td>April Ozil (see <a href="#C2">Heid Schwan</a>)</td>**
  <td></td>     
  <td></td>
</tr>
<tr>
  <td>Terry Hill</td>
  <td>B1</td>       
  <td>1212121212</td>
</tr>
</table>
</body>
</html>

如何使用xsl执行此操作?如果您能帮助我,我将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:0)

好的,那么。第一件事:设计输入XML的人都是白痴。首先,您可以使用结构化数据工具;你为什么要把两个名字塞进一个插槽?另一方面,确实有一天会有两个同名的客户。

除此之外,您需要做的是提取引用的名称并将其用作链接到引用人员锚点的键:

<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:key name="customer-by-name" match="customer" use="@name" />

<xsl:template match="/">
    <table>
        <tr>
            <th>Name</th>
            <th>Category</th>     
            <th>Phone</th>
        </tr>
        <xsl:apply-templates select="customers/customer"/>  
    </table>
</xsl:template>

<xsl:template match="customer">
    <tr>
      <td><a id="{generate-id()}"><xsl:value-of select="@name"/></a></td>
      <td><xsl:value-of select="@category"/></td>       
      <td><xsl:value-of select="@phone"/></td>
    </tr>
</xsl:template>

<xsl:template match="customer[contains(@name, ' (see ')]">
    <xsl:variable name="ref-name" select="substring-before(substring-after(@name, ' (see '), ')')" />
    <tr>
        <td>
            <xsl:value-of select="substring-before(@name, ' (see ')"/>
            <xsl:text> (see </xsl:text>
            <a href="#{generate-id(key('customer-by-name', $ref-name))}"><xsl:value-of select="$ref-name"/></a>
            <xsl:text>)</xsl:text>
      </td>
      <td><xsl:value-of select="@category"/></td>       
      <td><xsl:value-of select="@phone"/></td>
    </tr>
</xsl:template>

</xsl:stylesheet>