如何复制属性?

发布于 2025-01-17 10:47:54 字数 3293 浏览 0 评论 0原文

输入 xml 文件:

<root>
    <x1 attr11="sd5">
        <x2 attr12="sd6" attr15="sd7">
            <a />
            <b>
                <x3 attr18="sd8">
                    <c>
                        <x4 attr19="sd9"/>
                        <d />
                        <e />
                    </c>
                </x3>
            </b>
        </x2>
    </x1>
</root>

从中获取更新的“updates.xml”文件 - 标记属性:

<updates>
    <a attr1="adf" attr2="67" />
    <b attr3="g6h"/>    
    <c attr4="7jj" />   
    <d attr5="88" attr6="mn4" />    
    <e />
</updates>

如果输入文件包含“updates.xml”文件中的标记(不带属性),则使用“updates.xml”中的属性文件被复制到其中。 XSLT1.0 转换后的文件应如下所示:

<root>
    <x1 attr11="sd5">
        <x2 attr12="sd6" attr15="sd7">
            <a attr1="adf" attr2="67" />
            <b attr3="g6h">
                <x3 attr18="sd8">
                    <c attr4="7jj">
                        <x4 attr19="sd9"/>
                        <d attr5="88" attr6="mn4" />
                        <e />
                    </c>
                </x3>
            </b>
        </x2>
    </x1>
</root>

现在这是 XSLT1.0 转换文件:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exslt="http://exslt.org/common"
  exclude-result-prefixes="exslt"
  version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:param name="updates" select="document('updates.xml')"/>
  <xsl:key name="replacement" match="//*" use="local-name()"/>

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

  <xsl:template match="*[not(node())]">
    <xsl:variable name="element" select="(.)"/>
    <xsl:variable name="replacement">
      <xsl:for-each select="$updates">
        <xsl:copy-of select="key('replacement', local-name($element))"/>
      </xsl:for-each>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="exslt:node-set($replacement)/*">
        <xsl:copy-of select="$replacement"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="(.)"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

转换后的 XML 文件:

<root>
    <x1 attr11="sd5">
        <x2 attr12="sd6" attr15="sd7">
            <a attr1="adf" attr2="67" />
            <b>
                <x3 attr18="sd8">
                    <c>
                        <x4 attr19="sd9" />
                        <d attr5="88" attr6="mn4" />
                        <e />
                    </c>
                </x3>
            </b>
        </x2>
    </x1>
</root>

为什么属性没有复制到“b”和“c”标记?

Input xml file:

<root>
    <x1 attr11="sd5">
        <x2 attr12="sd6" attr15="sd7">
            <a />
            <b>
                <x3 attr18="sd8">
                    <c>
                        <x4 attr19="sd9"/>
                        <d />
                        <e />
                    </c>
                </x3>
            </b>
        </x2>
    </x1>
</root>

The "updates.xml" file from which updates are taken - tag attributes:

<updates>
    <a attr1="adf" attr2="67" />
    <b attr3="g6h"/>    
    <c attr4="7jj" />   
    <d attr5="88" attr6="mn4" />    
    <e />
</updates>

If the input file contains a tag (without attributes) from the "updates.xml" file, then the attributes from the "updates.xml" file are copied into it. The file after XSLT1.0 transformation should look like this:

<root>
    <x1 attr11="sd5">
        <x2 attr12="sd6" attr15="sd7">
            <a attr1="adf" attr2="67" />
            <b attr3="g6h">
                <x3 attr18="sd8">
                    <c attr4="7jj">
                        <x4 attr19="sd9"/>
                        <d attr5="88" attr6="mn4" />
                        <e />
                    </c>
                </x3>
            </b>
        </x2>
    </x1>
</root>

Now this is the XSLT1.0 transformation file:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exslt="http://exslt.org/common"
  exclude-result-prefixes="exslt"
  version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:param name="updates" select="document('updates.xml')"/>
  <xsl:key name="replacement" match="//*" use="local-name()"/>

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

  <xsl:template match="*[not(node())]">
    <xsl:variable name="element" select="(.)"/>
    <xsl:variable name="replacement">
      <xsl:for-each select="$updates">
        <xsl:copy-of select="key('replacement', local-name($element))"/>
      </xsl:for-each>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="exslt:node-set($replacement)/*">
        <xsl:copy-of select="$replacement"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="(.)"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

XML file after transformation:

<root>
    <x1 attr11="sd5">
        <x2 attr12="sd6" attr15="sd7">
            <a attr1="adf" attr2="67" />
            <b>
                <x3 attr18="sd8">
                    <c>
                        <x4 attr19="sd9" />
                        <d attr5="88" attr6="mn4" />
                        <e />
                    </c>
                </x3>
            </b>
        </x2>
    </x1>
</root>

Why aren't the attributes copied to the 'b' and 'c' tags?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北方的巷 2025-01-24 10:47:54

处理具有应用程序(即身份转换)的其他文档的原始属性以及其他文档的属性,并保持递归处理的活力:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exslt="http://exslt.org/common"
  exclude-result-prefixes="exslt"
  version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:param name="updates" select="document('updates.xml')"/>
  <xsl:key name="replacement" match="*" use="local-name()"/>

  <!--Identity template-->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:variable name="this" select="."/>
      <xsl:for-each select="$updates">
        <xsl:apply-templates select="key('replacement', local-name($this))/@*"/>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
 

</xsl:stylesheet>

Process both the original attributes as well as those from the other document with apply-templates (i.e. the identity transformation) and keep recursive processing alive:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exslt="http://exslt.org/common"
  exclude-result-prefixes="exslt"
  version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:param name="updates" select="document('updates.xml')"/>
  <xsl:key name="replacement" match="*" use="local-name()"/>

  <!--Identity template-->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:variable name="this" select="."/>
      <xsl:for-each select="$updates">
        <xsl:apply-templates select="key('replacement', local-name($this))/@*"/>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
 

</xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文