这是我第一次涉足XSLT,所以我可能完全错了。这是一个最小的repro(确实失败了),但在最终的解决方案中,我只知道所需的值比DETAIL节点高2级。
我有以下XSLT片段(XSLT 1.0,无法升级到2.0)
<xsl:template match="/">
<xsl:apply-templates select="//DETAIL"/>
</xsl:template>
<xsl:template match="DETAIL">
<br/>Current: <xsl:value-of select="@Name"/>
<br/>Ancestor: <xsl:value-of select="../../@Name"/>
</xsl:template>
我有以下XML文件
<?xml version="1.0" encoding="utf-8"?>
<ROOT Name="Desired">
<CHILD>
<DETAIL Name="NotTheDesired">
</DETAIL>
</CHILD>
</ROOT>
在Windows 10上的IE 11中处理时会导致(通知没有祖先属性的输出),但在使用.NET XslCompiledTransform处理时会产生(给出祖先属性的正确值)。
Current: NotTheDesired
Ancestor:
我尝试了很多这个主题的变体,包括在select表达式等周围使用string()。我尝试过的每个排列都没有输出祖先的属性值。
我没有编写代码来在IE中进行转换,但下面是正在做的事情。 xml是xml的序列化版本。 xsltDoc是xlst
var xmlDoc = new windows.ActivbeXObject("MSXML2.DOMDocument.6.0");
xmlDoc.async = false;
xmlDoc.loadXml(xml);
xmlDoc.resolveExternals = true;
var htmlString = xmlDoc.transformNode(xsltDoc);
答案 0 :(得分:0)
事实证明,正在进行转换的代码将XML加载到jQuery XMLDocument中,做了一些处理,包括去除DocumentElement,然后将其序列化并通过loadXml将其加载到Microsoft XML中。 (尽管我想要的所有节点仍然存在,但该过程中的某些东西显然无法产生预期的结果。)只需要原始开发人员大约需要2个小时才能解决这个问题。一旦我说服他保存原始字符串并在调用转换之前加载它,一切都按原样运行。难怪我觉得某些客户端处理工作不正常。
感谢所有人说出让我朝着正确的方向发展的东西来刺激剧本作家。