当前位置: 首页 > 知识库问答 >
问题:

重命名XML节点并用XSL替换值

费朗
2023-03-14
private static string GetOutput(string xmlFileName, string xslFileName)
{
    var xmlDocument = new XmlDocument();
    xmlDocument.Load(xmlFileName);

    var xslTransform = new XslCompiledTransform();
    xslTransform.Load(xslFileName);

    var stream = new MemoryStream();
    xslTransform.Transform(xmlDocument, null, stream);

    stream.Position = 1;
    var reader = new StreamReader(stream);
    string output = reader.ReadToEnd();

    return output;
}
<?xml version="1.0" encoding="utf-8" ?>
<TransformThis xmlns="http://schemas.datacontract.org/2004/07/TransformTest" 
             xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <f_name>John</f_name>
    <l_name>D&apos;Oh!</l_name>
    <Version>1.0</Version>
</TransformThis>

下面是我的XSL文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
                exclude-result-prefixes="msxsl">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Version/text()[.='1.0']">1.1</xsl:template>

    <xsl:template match="f_name">
        <FirstName>
            <xsl:apply-templates select="node()|@*"/>
        </FirstName>
    </xsl:template>

    <xsl:template match="l_name">
        <LastName>
            <xsl:apply-templates select="node()|@*"/>
        </LastName>
    </xsl:template>

</xsl:stylesheet>

当我运行我的程序时,输出与原始XML相同。f_name和l_name节点都没有重命名,Version节点值也没有被替换。

任何帮助都将不胜感激。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:tx="http://schemas.datacontract.org/2004/07/TransformTest"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
                exclude-result-prefixes="msxsl">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="tx:Version/text()[.='1.0']">1.1</xsl:template>

    <xsl:template match="tx:f_name">
        <FirstName>
            <xsl:apply-templates select="node()|@*"/>
        </FirstName>
    </xsl:template>

    <xsl:template match="tx:l_name">
        <LastName>
            <xsl:apply-templates select="node()|@*"/>
        </LastName>
    </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<Transformer xmlns="http://schemas.datacontract.org/2004/07/TransformTest" 
             xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <FirstName xmlns="" xmlns:tx="http://schemas.datacontract.org/2004/07/TransformTest">John</FirstName>
    <LastName xmlns="" xmlns:tx="http://schemas.datacontract.org/2004/07/TransformTest">Doh</LastName>
    <Version>1.1</Version>
</Transformer>

共有1个答案

澹台宾白
2023-03-14

f_name和l_name节点都没有重命名,Version节点值也没有被替换。

这些元素是 元素的子元素,该元素有自己的命名空间。必须在样式表中声明此命名空间,为其分配前缀,并在寻址元素或其后代时使用前缀。

补充:
这样试试?请注意,这有点棘手,因为您实际上是在向现有(复制的)父级添加新的子级。这些新元素不会自动继承它们的父元素的命名空间,它们需要显式地将其分配给它们。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://schemas.datacontract.org/2004/07/TransformTest"
exclude-result-prefixes="ns">

<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="ns:Version/text()[.='1.0']">1.1</xsl:template>

<xsl:template match="ns:f_name">
    <xsl:element name="FirstName" namespace="http://schemas.datacontract.org/2004/07/TransformTest">
        <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
</xsl:template>

<xsl:template match="ns:l_name">
    <xsl:element name="LastName" namespace="http://schemas.datacontract.org/2004/07/TransformTest">
        <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>
 类似资料:
  • 在本章中,我们将学习XML DOM对象中的替换节点操作。DOM中的所有内容都保存在分层信息单元中,替换节点提供了另一种更新这些指定节点或文本节点的方法。 以下是替换节点的两个方法 - 1. replaceChild()方法 方法用新节点替换指定的节点。 语法 具有以下语法 - 其中, - 是放入子列表的新节点。 - 是列表中要替换的节点。 此方法返回已替换的节点。 示例 以下示例(replacen

  • 我有一堆XML文档,其中包含我需要用假数据替换的个人信息。Person节点包含以下元素: UUID-必填项,不应触及。 名字-可选 LastName-可选 地址-可选 个人身份-必需 一个人可能会出现很多次,在这种情况下应该使用相同的假数据,即如果两个person节点具有相同的personID,那么它们都应该接收到相同的假ID。 我已经实现了一些Java代码,这些代码从XML字符串构建一个DOM树

  • 我正在从一个文件中读取xml结构,并替换示例中的值 > def inputXml=read('classpath:xml/input.xml') 我的xml结构如下所示 示例: 我想更新“n”标记名ACCOUNTTYPE和与上面类似的相应目的(键和值)。空手道有没有办法做到这一点?请建议。 Is是否可以在xml文件中使用“#(accountType)”和“#(purpose)",类似于json并运

  • 我对IIB很陌生。我正在IBM Integration Bus 10上创建一个中介服务。第一个节点是SOAP节点,第二个节点是XSL转换。完整的服务流程 当我在不同的工具中测试它时,XSL转换对我的SOAP输入运行良好。但是当我从soapui测试时,它在这里失败了。在Transform node之后,我获得了没有XML标记的输出(所有值都附加在单个字符串中) 我不知道为什么会这样。任何帮助都是非常

  • 我试着从前面的一个类似问题中调整一些代码,但是我的尝试似乎是没有希望的,因为它甚至没有从'activity'表中提取任何信息,但是它在'cstactivity'表中创建了'attid'字段,我想我最终可以达到这个目的,以便跨表进行连接/链接。唯一的问题是它实际上没有用相关的ID填充这个! 但理想情况下,我只想转换数据,以便导入仅包括“activity”节点上相关行中嵌套节点中的所有内容。 要导入的

  • 问题内容: 输入XML 输出Json 如何编写通用的xslt样式表,它将输入的xml转换为json 输入可能在根目录下有太多结果,在结果下可能有系统和名称,在系统下还有ID名称和值。 问题答案: 我从此处复制并粘贴的以下XSLT 应该可以帮助您将XML转换为JSON。谢谢 :)