internet-explorer - 模板递归错误

标签 internet-explorer firefox xslt recursion

我正在刷新我的 XST 知识,并决定尝试制作一个 XSLT 1.0 样式表,将 XMLHelp 文件从 C# 编译器转换为格式更好的形式。

有很多问题需要解决,但目前我只是尝试解析那些烦人的成员名称属性,并创建另一个 XML 文档,其中标记位于“:”和“.”之间。字符被提取并转换为元素。

首先,我想改变如下:

<member name="T:PrimeNumbers.Properties.Resources">

变成这样的东西:

<member type="T">
  <Properties>
    <Resources />
  </Properties>
</member>

现在,我已经编写了一个样式表,看起来好像应该输出另一个 XML 文档,但遗憾的是,当我处理数据时,XML Notepad 2007 崩溃了,IE7 和 Firefox 3.5.5 都给了我一个错误说那里正在进行无限递归。

如果有人能告诉我我做错了什么,我将不胜感激。

<xsl:transform version="1.0">

  <xsl:output 
    method="xml" version="4.0" encoding="iso-8859-1" 
    indent="yes" media-type="text/xml" 
  />

  <xsl:variable name="AssemblyName" />

  <xsl:template match="/">
    <xsl:apply-templates select="/doc/assembly" />
  </xsl:template>

  <xsl:template match="assembly/name">
    <xsl:variable name="AssemblyName" select="text()" />
    <assembly name="{$AssemblyName}">
      <xsl:apply-templates select="/doc" />
    </assembly>
  </xsl:template>

  <xsl:template match="/doc/members/member">
    <!-- This gives you a single letter 
         (T=Type P=Property M=Method F=Field) -->
    <member type="{substring-before(@name,':')}">
      <xsl:call-template name="RecurseName">
        <!-- This gives you the type name from the beginning 
             of the Namespace to the final local name. -->
        <xsl:with-param name="Path" select="
          substring-after(substring-after(@name,':'),'.')
        " />
      </xsl:call-template>
    </member>
  </xsl:template>

  <xsl:template name="RecurseName">
    <xsl:param name="Path" select="'default'" />
    <xsl:variable name="PathRemainder" select="substring-after($Path,'.')" />
    <xsl:value-of select="$PathRemainder" />
    <xsl:element name="{substring-before($Path,'.')}">
      <xsl:if test="$PathRemainder != ''">
        <xsl:call-template name="RecurseName">
          <xsl:with-param name="Path" select="$PathRemainder" />
        </xsl:call-template>
      </xsl:if>
    </xsl:element>
  </xsl:template>

</xsl:transform>

[稍后,我将转换此文档,以便如果成员具有匹配的元素,则将它们合并在一起。]

基本上,如果 RecurseName 模板存在(没有任何元素),它就会使 XML Notepad 2007 崩溃。请注意<xsl:value-of select="$PathRemainder"/>是纯粹的调试。

有什么想法吗?

附录 A:测试 XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="XmlDocTemplate3.xml" ?>
<doc>
  <assembly>
    <name>PrimeNumbers</name>
  </assembly>
  <members>
    <member name="T:PrimeNumbers.Properties.Resources">
      <summary>
              A strongly-typed resource class, for looking up localized strings, etc.
            </summary>
    </member>
    <member name="P:PrimeNumbers.Properties.Resources.ResourceManager">
      <summary>
              Returns the cached ResourceManager instance used by this class.
            </summary>
    </member>
    <member name="P:PrimeNumbers.Properties.Resources.Culture">
      <summary>
              Overrides the current thread's CurrentUICulture property for all
              resource lookups using this strongly typed resource class.
            </summary>
    </member>
    <member name="M:PrimeNumbers.Program.Main">
      <summary>
            The main entry point for the application.
            </summary>
    </member>
    <member name="M:PrimeNumbers.PrimeNumberForm.CalculatePrimeNumbers(System.Int32)">
      <summary>
            Calculates the prime numbers between 1 and the (count)th prime number.
            </summary>
      <param name="count">The number of prime numbers to return.</param>
      <returns>List of integers</returns>
      <exception cref="T:System.ArgumentOutOfRangeException">Thrown if <paramref name="count" /> is negative.</exception>
    </member>
    <member name="F:PrimeNumbers.PrimeNumberForm.components">
      <summary>
            Required designer variable.
            </summary>
    </member>
    <member name="M:PrimeNumbers.PrimeNumberForm.Dispose(System.Boolean)">
      <summary>
            Clean up any resources being used.
            </summary>
      <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    </member>
    <member name="M:PrimeNumbers.PrimeNumberForm.InitializeComponent">
      <summary>
            Required method for Designer support - do not modify
            the contents of this method with the code editor.
            </summary>
    </member>
  </members>
</doc>

最佳答案

您在线路上遇到错误:

<xsl:element name="{substring-before($Path,'.')}">

当到达命名空间的最后一部分时,其中不包含点“.”

您可以使用此代码段作为 RecurseName 模板:

<xsl:template name="RecurseName">
  <xsl:param name="Path" select="'default'"/>
  <xsl:choose>
    <xsl:when test="contains($Path, '.')">
      <xsl:element name="{substring-before($Path,'.')}">
        <xsl:call-template name="RecurseName">
          <xsl:with-param name="Path" select="substring-after($Path,'.')"/>
        </xsl:call-template>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <xsl:element name="{$Path}" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

我已经测试过了。生成的输出:

<member type="T">
  <Properties>
    <Resources />
  </Properties>
</member>

关于internet-explorer - 模板递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760801/

相关文章:

html - 在 Firefox Addon 中显示摄像头

javascript - Firefox 和 MS 浏览器中 jquery 返回的数据项顺序不同

Java XML 和 XSLT 转换错误 : Namespace for prefix 'm' has not been declared

java - JBOSS 在读取大型 XML 时重新启动

javascript - Internet Explorer 11 检测

javascript - 在 IE 中打开 HTML 窗口

css - Webkit 不应用 css margin-bottom

xml - xpath 1.0 第一个和最后一个节点

javascript - JQuery 在鼠标悬停时更改图像 src 在 IE7 和 8 中不起作用

javascript - 双击 contenteditable div 后将其聚焦