使用元素名称将输入 XML 传递给 XSLT 中的变量

Posted

技术标签:

【中文标题】使用元素名称将输入 XML 传递给 XSLT 中的变量【英文标题】:Passing input XML to variable in XSLT with element name 【发布时间】:2019-03-03 02:26:35 【问题描述】:

我正在尝试将输入 XML 映射到变量,但它正在消除所有标签的名称,只传递标签的值。

输入 XML

<Response>
    <FirstName>Manoj</FirstName>
    <LastName>Naik</LastName>
</Response>

XSLT

<xsl:stylesheet version="3.0"
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl in lang user f msxsl"
xmlns:in="http://www.composite.net/ns/transformation/input/1.0"
xmlns:lang="http://www.composite.net/ns/localization/1.0"
xmlns:f="http://www.composite.net/ns/function/1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
    <msxsl:script language="C#" implements-prefix="user">
        <msxsl:assembly name="System.Data"/>
        <![CDATA[
    public string GetVaribaleData(string text)
        

           return text;
           
    ]]>
    </msxsl:script>
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
    <xsl:template match="/">
        <xsl:variable name="encdata">
            <xsl:copy-of select="." />
            <!--<xsl:copy-of select="node()"/>-->
      <!--<xsl:copy-of select="*" />-->
      <!-- <xsl:copy-of select="node()|@*" /> -->
        </xsl:variable>
        <xsl:variable name="json" select="user:GetVaribaleData($encdata)"/>
    </xsl:template>
</xsl:stylesheet>

上面的代码在输出变量中返回\n\tManoj\n\tNaik\n

变量encdata中的预期信息和C#函数text中存在的参数如下 -

<Response>
    <FirstName>Manoj</FirstName>
    <LastName>Naik</LastName>
</Response>

我想将输入 XML 和元素名称一起传递给 XSLT 中的encdata。我想在 C# 代码中使用该变量对其进行进一步处理。

有没有办法做到这一点?

【问题讨论】:

您在这里想要达到的目标并不完全清楚。与其展示您如何尝试解决此问题,不如说明您要解决的问题是什么,因为我不确定您是否在此处使用特定于供应商的功能。如果您显示了在这种情况下期望获得的输出,这将有所帮助。谢谢! 您使用的是哪个 XSLT 处理器?使用msxsl:script language="C#" 表明它是Microsoft 的XslCompiledTransform,但在这种情况下使用version="3.0" 似乎没有意义,因为Microsoft 仅支持XSLT 1.0。至于在 XSLT 和 C# 之间传递 XML,这取决于特定的处理器,使用 Microsoft,您可以编写一个以 XPathDocumentXPathNodeIterator 作为参数的函数。 如果您使用XslCompiledTransform,另请参阅docs.microsoft.com/en-us/dotnet/standard/data/xml/…,了解 XSLT/XPath 类型(如节点集或结果树片段)到某些 .NET 类型的映射。 @TimC 我已经更新了问题并提到了预期的输出。 如果处理器是XslCompiledTransform那么你可以使用GetVaribaleData(XPathNavigator node) // here you can use the XPathNavigator API to further process the passed in XML, not as a string but as an XPathNavigator object 【参考方案1】:

这对于用 cmets 编写来说太长了,但是您真的需要在那里使用 C# 函数,它将您的代码绑定到特定的处理器吗?也许您可以使用命名模板在纯 XSLT 中实现相同的目标?

例如,试试这个 XSLT:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:in="http://www.composite.net/ns/transformation/input/1.0"
    xmlns:lang="http://www.composite.net/ns/localization/1.0"
    xmlns:f="http://www.composite.net/ns/function/1.0"
    exclude-result-prefixes="in lang f">

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

    <xsl:template name="GetVariableData">
        <xsl:param name="node" />
        <xsl:param name="name" />
        <xsl:value-of select="$node/*[local-name() = $name]" />
    </xsl:template>

    <xsl:template match="/">
        <xsl:variable name="encdata" select="Response" />
        <xsl:call-template name="GetVariableData">
            <xsl:with-param name="node" select="$encdata" />
            <xsl:with-param name="name" select="'LastName'" />
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

以上是关于使用元素名称将输入 XML 传递给 XSLT 中的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 替换命名空间中的元素?

如何使用 XSLT 将名称空间添加到我的 XML 的根元素?

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

如何使用 XSLT 替换 XML 节点名称中的字符 - 更改根元素

如何修复 XSLT 3.0 地图问题?

使用 XSLT 从 XML 中查询和提取数据