1

只有当子元素还没有相同的属性时,如何才能将属性传递给子元素?

XML:

<section>
    <container attribute1="container1" attribute2="container2">
         <p attribute1="test3"/>
         <ol attribute2="test4"/>
    <container>
<section/>

输出应如下所示:

<section>
    <p attribute1="test3" attribute2="test2"/>
    <ol attribute1="container1" attribute2="test4"/>
</section>

这是我尝试过的:

<xsl:template match="container">
    <xsl:apply-templates mode="passAttributeToChild"/>
</xsl:template>

<xsl:template match="*" mode="passAttributeToChildren">
    <xsl:element name="{name()}">
        <xsl:for-each select="@*">
             <xsl:choose>
                  <xsl:when test="name() = name(../@*)"/>
                  <xsl:otherwise>
                      <xsl:copy-of select="."/>
                  </xsl:otherwise>
             </xsl:choose>
        </xsl:for-each>
        <xsl:apply-templates select="*|text()"/>
    </xsl:element>
</xsl:template>

任何帮助将不胜感激;)提前谢谢您!

4

2 回答 2

0

多次声明的属性会相互覆盖,所以这很容易。

<xsl:template match="container/*">
  <xsl:copy>
    <xsl:copy-of select="../@*" /> <!-- take default from parent -->
    <xsl:copy-of select="@*" />    <!-- overwrite if applicable -->
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

正如您的示例似乎表明的那样,这假设您想要所有父属性。当然,您可以决定要继承哪些属性:

    <xsl:copy-of select="../@attribute1 | ../@attribute2" />
    <xsl:copy-of select="@attribute1 | @attribute2">
于 2013-08-05T12:06:08.210 回答
0

尝试这个。

<!-- root and static content - container -->
<xsl:template match="/">
    <section>
        <xsl:apply-templates select='section/container/*' />
    </section>
</xsl:template>

<!-- iteration content - child nodes -->
<xsl:template match='*'>
    <xsl:element name='{name()}'>
        <xsl:apply-templates select='@*|parent::*/@*' />
    </xsl:element>
</xsl:template>

<!-- iteration content - attributes -->
<xsl:template match='@*'>
    <xsl:attribute name='{name()}'><xsl:value-of select='.' /></xsl:attribute>
</xsl:template>

在输出每个子节点时,我们迭代地传输其属性和父节点的属性。

<xsl:apply-templates select='@*|parent::*/@*' />

模板按照它们在 XML 中出现的顺序应用于节点。所以父 ( container) 节点出现在子节点之前(当然),所以属性模板首先处理的是父节点的属性。

这很方便,因为这意味着如果子节点自己的属性已经存在,模板将始终优先显示它们,因为它们是最后处理的,因此优先于来自父节点的具有相同名称的任何属性。因此,父母不能推翻他们。

这个 XMLPlayground工作演示

于 2013-08-05T10:55:51.907 回答