【问题标题】:XSLT transform doesn't recognize attribute of parent nodeXSLT 转换无法识别父节点的属性
【发布时间】:2016-08-16 18:59:25
【问题描述】:

.Net XSLT 解析器无法识别父属性(类型),如果该节点有子节点(贡献者)。以下场景返回空,但如果我删除子节点,则返回正确的结果。

输入 XML

<contributors>
  <roles>
    <role type="Actor">
      <contributor />
    </role>
  </roles>
</contributors>

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="/">
    <a>
      <xsl:value-of select="contributors/roles/role/@type" />
    </a>
  </xsl:template>
</xsl:stylesheet>

输出

<a></a>

我的 C# 方法

    public static XDocument TransformXML(string inputXMLString, string xslt)
    {
        var xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(inputXMLString));
        inputXMLString = xmlDocumentWithoutNs.ToString();

        var xslCompiledTransform = new XslCompiledTransform();
        using (var stringReader = new StringReader(xslt))
        using (var xmlReader = XmlReader.Create(stringReader))
        {
            xslCompiledTransform.Load(xmlReader);
        }
        using (var stringReader = new StringReader(inputXMLString))
        using (var xmlReader = XmlReader.Create(stringReader))
        using (var stringWriter = new StringWriter())
        {
            xslCompiledTransform.Transform(xmlReader, new XsltArgumentList(), stringWriter);
            var resultXML = stringWriter.ToString();
            var otuput = XDocument.Parse(resultXML);
            return otuput;
        }
    }

【问题讨论】:

  • 您要“删除”什么子节点?您在哪里看到“父属性”?
  • 与 xalanj 和 xsltproc 中的贡献者子节点正常工作,奇怪

标签: c# .net xml xslt


【解决方案1】:

尝试不移除 NS。它对我有用:-)

var xmlDocumentWithoutNs = XElement.Parse(inputXMLString);

【讨论】:

  • 谢谢 Aishu.. 看来我需要修复我的方法以删除命名空间
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多