保留从xsl传递到c#方法的参数中的标记

时间:2016-03-28 06:58:36

标签: c# xml xslt escaping double-quotes

我在文本部分有一个带有html和自定义标签的xml,下面给出了xml片段 -

<Text>
    <English>
        <p>Some text goes here with html tags like
        <span class='classname'>more text</span> and
        custom tags <CustomTag uid='value'>and
        text</CustomTag></p>
    </English>
</Text>

现在,问题是三重的 -

  1. 在Text:child
  2. 中保留html标签
  3. 处理自定义标记Text :: child
  4. 转义输出字符串中的双引号
  5. 使用的xsl代码段是 -

    这是使用Text :: child(英语或其他)的地方

    <xsl:variable name='stepText'><xsl:apply-templates select='Text/child::*[name() = $language]'/></xsl:variable>
    <!-- This is the problem statement -->
    <xsl:variable name='stepTextNew'><xsl:copy-of select="cs:EscapeDoubleQuotes($stepText)"/></xsl:variable>
    jQuery('#stepText').html("<xsl:copy-of select='$stepTextNew'/>");
    

    上面的代码片段调用xsl中的c#方法EscapeDoubleQuotes来从apply-templates返回的字符串中转义双引号。

    这适用于Text :: child -

    中的自定义标签
    <xsl:template match="CustomTag">
        <xsl:element name="a">
            <xsl:attribute name="href">javascript:doSomething(1, '<xsl:value-of select="@uid"/>');</xsl:attribute>
            <xsl:attribute name="onmouseover">javascript:onHover(1, '<xsl:value-of select="@uid"/>', true);</xsl:attribute>
            <xsl:attribute name="onmouseout">javascript:onLeave(1, '<xsl:value-of select="@uid"/>', false);</xsl:attribute>
        </xsl:element>
    </xsl:template>
    

    这适用于Text :: child -

    中的html标签
    <xsl:template match="p | span">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    

    现在,我遇到的问题是传递给cs:EscapeDoubleQuotes的字符串中的标签会自动剥离。如果我尝试直接输出stepText,它确实包含标签,但stepTextNew没有。我尝试调试c#方法,看到标签在输入参数本身被剥离。

    如果有人能够对这个问题有所了解或提供解决上述三个问题的任何提示,将会有很大的帮助。

1 个答案:

答案 0 :(得分:1)

您似乎只想使用XSLT创建一些HTML节点,然后将它们序列化为一个字符串,您可以将其传递给JQuery方法html。简单地使用纯XSLT来创建或填充stepText元素似乎更容易:

<div id="stepText">
  <xsl:copy-of select="$stepText"/>
</div>

如果你真的想将XSLT生成的HTML传递给C#扩展函数,该函数替换标记上的一些双引号,那么我认为你需要确保你处理OuterXml的{​​{1}}你传入了例如

XPathNavigator

针对输入

运行
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:cs="http://example.com/cs"
  exclude-result-prefixes="msxsl cs">

  <xsl:param name="language" select="'English'"/>

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

  <xsl:template match="/">
    <html lang="en">
      <head>
        <title>Test</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
        <script>
          $(document).ready(function() {

          <xsl:variable name="stepText">
            <xsl:apply-templates select="Text/child::*[name() = $language]/node()"/>
          </xsl:variable>
          $('#stepText').html("<xsl:value-of select="cs:EscapeCrLf(cs:EscapeDoubleQuotes($stepText))"/>");
          });
        </script>
        <script>
          function doSomething(n, id) {
            alert(n + ': ' + id);
          }
        </script>

      </head>
      <body>
        <div id="stepText"></div>
      </body>
    </html>
  </xsl:template>

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

  <xsl:template match="CustomTag">
    <a href="#" onclick="doSomething(1, '{@uid}'); return false;">
      <xsl:apply-templates/>
    </a>
  </xsl:template>

  <msxsl:script implements-prefix="cs" language="C#">
    public string EscapeDoubleQuotes(XPathNavigator input) {
    return input.OuterXml.Replace("\"", "\\\"");
    }

    public string EscapeCrLf(string input) {
    return input.Replace("\r", "\\r").Replace("\n", "\\n");
    }
  </msxsl:script>

</xsl:stylesheet>

产生输出

<Text>
  <English>
    <p>
      Some text goes here with html tags like
      <span class='classname'>more text</span> and
      custom tags <CustomTag uid='value'>
        and
        text
      </CustomTag>
    </p>
  </English>
</Text>