2015-11-04 2 views
0

У меня есть следующий HTML:Изменить HTML динамически через XSL

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

<table style="width:100%"> 
    <tr> 
    <th>Name</th> 
    <th>City</th> 
    <th>State</th> 
    <th>Zip</th>   
    </tr> 
    <tr> 
    <td> [lastName],[firstName] </td> 
    <td>[City]</td> 
    <td>[State]</td> 
    <td>[Zip]</td> 
    </tr> 
</table> 

</body> 
</html> 

я получить значения из XML-

<person> 
    <lastName>Zones</lastName> 
    <firstName>Adam</firstName> 
    <City>Columbus</City> 
    <State>OH</State> 
    <Zip>44250</Zip> 
</person> 

Я хочу, чтобы заменить значения в таблице данных <td> элементы динамически :

<td>Zones, Adam</td> 
<td>columbus</td> 
<td>OH</td> 
<td>44250</td> 

Как достичь этого, необходимо изменить название, город, штат, почтовый индекс с пользовательскими вводами.

+0

XSL не работает, он имеет определенный синтаксис, который не имеет никакого отношения к HTML, который у вас там есть. –

+1

Ну, обычный подход заключается в том, чтобы XSLT обрабатывал вход XML и имел шаблоны, которые создают HTML, в шаблоне вы использовали бы синтаксис XSLT, например ', ... '. Если вы используете свой собственный синтаксис шаблона, вам может понадобиться реализовать собственный язык программирования, обрабатывающий шаблоны. –

ответ

0

Это довольно утомительно делать в XSLT 1.0, но, конечно, возможно:

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

<xsl:param name="lookup-doc-path" select="'person.xml'"/> 

<xsl:key name="elem-by-name" match="*" use="name()" /> 

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

<xsl:template match="td"> 
    <xsl:copy> 
     <xsl:call-template name="merge"> 
      <xsl:with-param name="string" select="."/> 
     </xsl:call-template> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="merge"> 
    <xsl:param name="string"/> 
    <xsl:choose> 
     <xsl:when test="contains($string, '[') and contains(substring-after($string, '['), ']')"> 
      <xsl:value-of select="substring-before($string, '[')" /> 
      <!-- lookup --> 
      <xsl:variable name="placeholder" select="substring-before(substring-after($string, '['), ']')" /> 
      <xsl:for-each select="document($lookup-doc-path)"> 
       <xsl:value-of select="key('elem-by-name', $placeholder)" /> 
      </xsl:for-each> 
      <!-- recursive call --> 
      <xsl:call-template name="merge"> 
       <xsl:with-param name="string" select="substring-after(substring-after($string, '['), ']')" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$string" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Это предполагает, что вы направляете свой процессор XSLT для обработки HTML-документа (который также должен быть хорошо сформированный XML-документ!) и предоставление пути к XML-документу, содержащему фактические значения в качестве параметра.

Если это лучший рабочий процесс, который должен иметь место, это еще один вопрос.

Смежные вопросы