【问题标题】:C# XSLT remove nodeC# XSLT 删除节点
【发布时间】:2012-04-09 18:46:24
【问题描述】:

有人可以帮我解决这个问题吗?我需要在 C# 中删除节点 "xsl:variable" ,如您所见,这里有两个带有子元素 xsl:variable 的 xsl:template 节点。在此示例中,我需要使用 C# 将其删除。

类似这样的:

XmlDocument d = new XmlDocument();
d.Load("MyFileName.Xml");
XmlNode t = d.SelectSingleNode("/navigation/page[@id='1']");
t.ParentNode.RemoveChild(t);
d.Save();

但我无法获得 'xsl:variable' 到 d.SelectSingleNode() 的路径

请帮帮我?

这是 XSLT:

<xsl:template name="Aggregate:RealECBooleanToXMLBoolean">
        <xsl:param name="RealECBoolean" select="/.."/>
        <xsl:variable name="var1_result">
            <xsl:value-of select="($RealECBoolean = 'Yes')"/>
            <xsl:value-of select="($RealECBoolean = 'YES')"/>
            <xsl:value-of select="($RealECBoolean = 'X')"/>
        </xsl:variable>
        <xsl:variable name="var2_resultof_any" select="boolean(translate(normalize-space($var1_result), 'false0 ', ''))"/>
        <xsl:choose>
            <xsl:when test="string((string((string($var2_resultof_any) != 'false')) != 'false')) != 'false'">
                <xsl:value-of select="(string((string($var2_resultof_any) != 'false')) != 'false')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="false()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template name="Aggregate:LookupRECodeName">
        <xsl:param name="RECode" select="/.."/>
        <xsl:call-template name="vmf:vmf1_inputtoresult">
            <xsl:with-param name="input" select="$RECode"/>
        </xsl:call-template>
    </xsl:template>

【问题讨论】:

  • 它可能找不到节点,因为未定义“xsl:”命名空间。此链接可能会有所帮助:stackoverflow.com/questions/443250/…
  • 谢谢 M3NTA7 我有一个获取所有 xsl:template 节点的代码,但下一步是删除所有子 xsl:variable 节点,我不能用这个示例上层做到这一点。需要 SingleNode 值。

标签: c# xslt


【解决方案1】:

您需要将定义 xsl 前缀的名称空间管理器传递给 SelectNodesSelectSingleNode

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xDoc.NameTable);
namespaceManager.AddNamespace("xsl" , "http://www.w3.org/1999/XSL/Transform");

然后:

XmlNode variableNode = xDoc.SelectSingleNode("//xsl:variable", namespaceManager);

将选择第一个 xsl:variable 元素,或者

XmlNodeList variableNodes = xDoc.SelectNodes("//xsl:variable", namespaceManager);

将选择所有 xsl:variable 元素

【讨论】:

    【解决方案2】:

    这是一个想法。我不确定在使用 SelectNodes 时是否需要“xsl”名称空间,您必须对此进行试验。

    public void YouMethod() {

    XmlDocument doc = new XmlDocument();
    doc.Load("your.xsl");
    
    XmlNode root = doc.DocumentElement;
    
    // iterate the template nodes
    foreach (XmlNode tNode in root.SelectNodes("//xsl:template"))
    {
      // iterate the variable child nodes
      foreach (XmlNode vNode in tNode.SelectNodes("xsl:variable"))
      {
          tNode.RemoveChild(vNode);
      } 
    }
    
    doc.Save();
    

    }

    【讨论】:

    • 再次感谢 M3NTA7 我发现我的 root.SelectNodes("//xsl:template")) 部分有问题。我试图删除 xsl 但又出现错误。我发现我需要 XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xDoc.NameTable); 'namespaceManager' 然后得到这个错误 'Namespace prefix 'xsl' is not defined。'
    • 您还有问题吗?看代码对我们很有帮助。这样我们就可以看到您正在尝试什么。
    • 是的,我还有问题可能是我可以给你发送 xsl 文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多