使用XSLT选择子节点

时间:2012-04-03 11:37:17

标签: xslt xpath

转换xml的xslt select语句是什么
<A>
  <B id="x">
    <C>
      <D>
      <D>
      <D>
      <D>
    </C>
  </B>
</A>

<C name = "x">
  <D>
  <D>
  <D>
  <D>
</C>

3 个答案:

答案 0 :(得分:4)

这是一个简短而完整的解决方案

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

 <xsl:template match="B[@id]/C">
  <C name="{../@id}">
    <xsl:copy-of select="node()"/>
  </C>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档(已更正为格式正确):

<A>
    <B id="x">
        <C>
            <D/>
            <D/>
            <D/>
            <D/>
        </C>
    </B>
</A>

产生了想要的正确结果

<C name="x">
   <D/>
   <D/>
   <D/>
   <D/>
</C>

<强>解释

  1. 正确使用模板模式匹配。

  2. 使用 AVT

答案 1 :(得分:0)

.C

<xsl:copy>
  <xsl:attribute name="name">
    <xsl:value-of select="../@id"/>
  </xsl:attribute>
  <xsl:copy-of select="*"/>
</xsl:copy>

答案 2 :(得分:0)

我会去

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <out>
            <xsl:apply-templates/>
        </out>
    </xsl:template>

    <xsl:template match="C">
        <xsl:copy>
            <xsl:attribute name="name"><xsl:value-of select="../@id"></xsl:value-of></xsl:attribute>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

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

    <xsl:template match="A|B">
            <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

哪个转换

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <B id="x">
        <C>
            <D/>
            <D/>
            <D/>
            <D/>
        </C>
    </B>
</A>

<?xml version="1.0" encoding="UTF-8"?>
<out>
    <C name="x">
        <D/>
        <D/>
        <D/>
        <D/>
    </C>
</out>