简体   繁体   中英

XSLT transformation and replacing placeholders

I'm not very good at XSLT, so hopefully someone can help :)

I'm trying to convert an HTML template (called from C# code), replacing placeholders with data from an XML file.

The (simplified) HTML template looks like:

<html>
    <body>
        Dear $firstName $lastName,
    </body>
</html>

The XML file looks like:

<inputXml>
    <firstName>Joske</firstName>
    <lastName>Vermeulen</lastName> 
</inputXml>

And the XSLT I came up with so far looks like:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            exclude-result-prefixes="msxsl"
            version="1.0"
            xmlns:s0="http://www.w3.org/1999/xhtml">

  <xsl:output omit-xml-declaration="yes" method="text" version="1.0" />

  <xsl:variable name="templateMessage" select="document('stream:///TemplateMessage')" />    
  <xsl:variable name="inputData" select="/" />

  <xsl:template match="/">
      <xsl:apply-templates select="$templateMessage/*/node()" />
  </xsl:template>

  <xsl:template match="*/*">
      <xsl:value-of select="$inputData//*[name()=name(current())]"/>
  </xsl:template>

</xsl:stylesheet>

For some reason the output of the transformation is just empty, because the last match is probably not correct. (If I omit the last match, I get the original HTML template as output).

Anyone sees what I did wrong?

Ok, found a solution.

The template has placeholders like this:

<html>
    <body>
        Dear <span class="placeholder">firstName</span> <span class="placeholder">lastName</span>,
    </body>
</html>

And the XSLT looks like:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
          xmlns:msxsl="urn:schemas-microsoft-com:xslt"                
          exclude-result-prefixes="msxsl"
          version="1.0"
    xmlns:s0="http://www.w3.org/1999/xhtml">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />

    <!-- This is the XML data to use to replace the placeholders in the HTML template with -->
    <xsl:variable name="inputData" select="document('stream:///InputData')" />

    <xsl:variable name="placeholders">
        <list>
            <placeholder id="firstName" value="{$inputData/inputXml/firstName}" />
            <placeholder id="lastName" value="{$inputData/inputXml/lastName}" />      
        </list>
    </xsl:variable>

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

  <!-- Replace every placeholder in the HTML template with the value from the XML data defined by its XPATH -->
  <xsl:template match="span[@class='placeholder']">
    <xsl:variable name="this" select="node()"/>        
    <xsl:value-of select="msxsl:node-set($placeholders)/list/placeholder[@id = $this]/@value" />
  </xsl:template>

</xsl:stylesheet>

For just simple replacing the $firtstname and $lastname from the xml file I tried something like this and it works. Let me know if something is not clear. Just sharing with you in case it helps.

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        exclude-result-prefixes="msxsl"
        version="2.0">
       <xsl:variable name="templateMessage" select="document('MyXmldata.xml')" />
      <xsl:variable name="inputData" select="/" />
          <xsl:template match="/">
          <html>
              <body>
                 <xsl:variable name="firstName" select="$templateMessage/inputXml/firstName" />
                 <xsl:variable name="lastName" select="$templateMessage/inputXml/lastName" />
                  <xsl:variable name="StringValue" select="node()" />
                  <xsl:variable name="StringValue1" select="replace($StringValue,'\$firstName',$firstName)" />
                  <xsl:variable name="StringValue2" select="replace($StringValue1,'\$lastName',$lastName)" />
            </body>
         </html>
     </xsl:template>

May be this code can help you .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM