XSLT:从子元素复制属性

发布于 2024-10-23 15:35:39 字数 299 浏览 3 评论 0原文

输入:

 <a q='r'>
   <b x='1' y='2' z='3'/>
   <!-- other a content -->
 </a>

期望的输出:

 <A q='r' x='1' y='2' z='3'>
   <!-- things derived from other a content, no b -->
 </A>

有人能给我一个食谱吗?

Input:

 <a q='r'>
   <b x='1' y='2' z='3'/>
   <!-- other a content -->
 </a>

Desired output:

 <A q='r' x='1' y='2' z='3'>
   <!-- things derived from other a content, no b -->
 </A>

Could someone kindly give me a recipe?

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

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

发布评论

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

评论(2

最美的太阳 2024-10-30 15:35:39

简单的。

<xsl:template match="a">
  <A>
    <xsl:copy-of select="@*|b/@*" />
    <xsl:apply-templates /><!-- optional -->
  </A>
</xsl:template>

如果您没有要处理的 的其他子项,则不需要

请注意,

  • 使用 将源节点插入到输出中,未更改,
  • 使用联合运算符 | 一次选择多个不相关的
  • 节点可以将属性节点复制到新元素,只要这是您添加任何子元素之前要做的第一件事。

编辑:如果您需要缩小复制的属性以及保留的属性,请使用此(或其变体):

<xsl:copy-of select="(@*|b/@*)[
  name() = 'q' or name() = 'x' or name() = 'y' or name() = 'z'
]" />

或者甚至

<xsl:copy-of select="(@*|b/@*)[
  contains('|q|x|y|z|', concat('|', name(), '|'))
]" />

注意括号如何使谓词应用于所有匹配的节点。

Easy.

<xsl:template match="a">
  <A>
    <xsl:copy-of select="@*|b/@*" />
    <xsl:apply-templates /><!-- optional -->
  </A>
</xsl:template>

The <xsl:apply-templates /> is not necessary if you have no further children of <a> you want to process.

Note

  • the use of <xsl:copy-of> to insert source nodes into the output unchanged
  • the use of the union operator | to select several unrelated nodes at once
  • that you can copy attribute nodes to a new element as long as it is the first thing you do - before you add any child elements.

EDIT: If you need to narrow down which attributes you copy, and which you leave alone, use this (or a variation of it):

<xsl:copy-of select="(@*|b/@*)[
  name() = 'q' or name() = 'x' or name() = 'y' or name() = 'z'
]" />

or even

<xsl:copy-of select="(@*|b/@*)[
  contains('|q|x|y|z|', concat('|', name(), '|'))
]" />

Note how the parentheses make the predicate apply to all matched nodes.

等风也等你 2024-10-30 15:35:39

XSL

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

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

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

    <xsl:template match="b"/>

</xsl:stylesheet>

输出

<A q="r" x="1" y="2" z="3"><!-- other a content --></A>

XSL

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

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

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

    <xsl:template match="b"/>

</xsl:stylesheet>

output

<A q="r" x="1" y="2" z="3"><!-- other a content --></A>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文