XSLT 转换:如何在转换过程中保留元素的属性

本文关键字:转换 保留 元素 属性 过程中 XSLT | 更新日期: 2023-09-27 18:31:01

我在 C# 中有一个函数,用于获取 XML 数据并使用 XSLT 样式表对其进行排序,然后返回排序后的数据并将其放入 XMLDocument 对象中。XSLT 将正确处理数据,但不会正确返回所有数据。正如您在下面看到的,缺少照顾者内容的属性。

这是 XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
  <xsl:template match="MatchedSources">
    <xsl:copy>
      <xsl:apply-templates>
         <xsl:sort data-type="number" order="descending" select="OverallMatchValue"/>
         </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

输入 XML 数据如下所示:

<?xml version="1.0"?>
<MatchedSources responseId="1" dataSourceType="Document">
    <MatchedSource>
        <SourceId>1001</SourceId>
        <DifferentPerspectives>
            <Carer>
                <CarerContent id="1" title="text">content</CarerContent>
                <CarerContent id="2" title="text">content</CarerContent>
            </Carer>
        </DifferentPerspectives>
        <OverallMatchValue>45</OverallMatchValue>
    </MatchedSource>
   <MatchedSource>
        <SourceId>1002</SourceId>
        <DifferentPerspectives>
            <Carer>
                <CarerContent id="1" title="text">content</CarerContent>
                <CarerContent id="2" title="text">content</CarerContent>
            </Carer>
        </DifferentPerspectives>
        <OverallMatchValue>78</OverallMatchValue>
    </MatchedSource>
</MatchedSources>

以及生成的输出 XML:

<?xml version="1.0"?>
<MatchedSources responseId="1" dataSourceType="Document">
    <MatchedSource>
        <SourceId>1002</SourceId>
        <DifferentPerspectives>
            <Carer>
                <CarerContent id="1" title="text">content</CarerContent>
                <CarerContent id="2" title="text">content</CarerContent>
            </Carer>
        </DifferentPerspectives>
        <OverallMatchValue>78</OverallMatchValue>
    </MatchedSource>
   <MatchedSource>
        <SourceId>1001</SourceId>
        <DifferentPerspectives>
            <Carer>
                <CarerContent>content</CarerContent>
                <CarerContent>content</CarerContent>
            </Carer>
        </DifferentPerspectives>
        <OverallMatchValue>45</OverallMatchValue>
    </MatchedSource>
</MatchedSources>

XSLT 转换:如何在转换过程中保留元素的属性

是的,这是一个常见的简单错误。<xsl:copy>只复制元素本身,相当于<xsl:element name="{name()}">。您需要显式复制属性节点。

例如,只需通过以下方式切换默认模板:

<xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

或者,如果您希望对某些属性具有某些特定行为,请使用完整的"匹配设计":

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
  <xsl:template match="MatchedSources">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-template/>
         <xsl:sort data-type="number" order="descending" select="OverallMatchValue"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*">
       <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>

您应该了解身份转换模板 - 并使用它代替第二个模板。