【问题标题】:Save original xml in XSLT conversion在 XSLT 转换中保存原始 xml
【发布时间】:2012-08-01 20:20:05
【问题描述】:

我正在尝试转换传入的 XML,但将原始 xml 保留在新节点中。

假设正在转换以下 XML。

<Document>
   <Number>12345</Number>
   <Name>Person Name</Name>
</Document>

我想要的输出是这样的:

<Document>
   <Number>12345</Number>
   <OriginalXml>
       <![CDATA[
           ^^ the above xml ^^
       ]]
   </OriginalXml>
</Document>

我在 C# 中很容易做到,但开发经理想看看它在 XSLT 中是否可行。

谢谢。

【问题讨论】:

  • 我不是很擅长 xslt。我们当前的 xslt 根据需要转换 xml 文档。我只需要确定是否可以在新的 OriginalXml 节点中添加未转换的 xml。
  • 输出中是否有(有效的)CDATA 要求?如果原始 XML 格式正确,那么使用 CDATA 有什么意义?
  • 真的要求您保留的不是原始 XML,而是它的转义版本吗? (例如使用 CDATA)如果需要转义原始 XML,请尝试 stackoverflow.com/questions/11620147/…
  • 我们将 Xml 存储在数据库中。我们将原始 xml 存储在数据库中。因此我们需要它不被转义。

标签: xml xslt


【解决方案1】:

你可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="/Document">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <OriginalXml>
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                <xsl:copy-of select="."/>
                <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </OriginalXml>      
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Name"/>

</xsl:stylesheet>

输出

<Document>
   <Number>12345</Number>
   <OriginalXml>
      <![CDATA[<Document>
         <Number>12345</Number>
         <Name>Person Name</Name>
      </Document>]]>
   </OriginalXml>
</Document>

【讨论】:

  • 在创建新 XSLT 文件时应用 Visual Studio 提供的 XSLT 标识转换的好示例。
  • @MihaiTodor - 谢谢。我在 oXygen 中使用的 XSLT 模板也默认具有身份转换。我几乎在每个样式表中都使用它。
  • 对 D-O-E 的巧妙但邪恶的使用!
  • @LarsH - 使用 D-O-E 感觉很不对劲。我尽量避免它像瘟疫一样;-)
  • 我会测试并让你知道如果我让它工作。如果一切顺利,我会在之后将您的答案标记为正确。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多