无法在XSLT中获取Ancestor节点上的Attribute值

时间:2016-02-09 14:15:08

标签: xml internet-explorer xslt

这是我第一次涉足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);

1 个答案:

答案 0 :(得分:0)

事实证明,正在进行转换的代码将XML加载到jQuery XMLDocument中,做了一些处理,包括去除DocumentElement,然后将其序列化并通过loadXml将其加载到Microsoft XML中。 (尽管我想要的所有节点仍然存在,但该过程中的某些东西显然无法产生预期的结果。)只需要原始开发人员大约需要2个小时才能解决这个问题。一旦我说服他保存原始字符串并在调用转换之前加载它,一切都按原样运行。难怪我觉得某些客户端处理工作不正常。

感谢所有人说出让我朝着正确的方向发展的东西来刺激剧本作家。