XSLT转换和替换占位符

时间:2015-07-31 07:45:03

标签: c# xml xslt

我不太擅长XSLT,所以希望有人可以提供帮助:)

我试图转换HTML模板(从C#代码调用),用XML文件中的数据替换占位符。

(简化)HTML模板如下所示:

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

XML文件如下所示:

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

到目前为止我想出的XSLT看起来像是:

<?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>

由于某种原因,转换的输出只是空的,因为最后一次匹配可能不正确。 (如果我省略了最后一个匹配,我将原始HTML模板作为输出)。

有人看到我做错了什么吗?

2 个答案:

答案 0 :(得分:0)

好的,找到了解决方案。

模板有这样的占位符:

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

XSLT看起来像:

<?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>

答案 1 :(得分:-2)

为了简单地从xml文件中替换$ firtstname和$ lastname,我尝试了类似这样的东西并且它有效。如果有什么不清楚,请告诉我。如果它有帮助,请与您分享。

raw_input()

可能这段代码可以帮到你。