开发者

Maintain all xml elements in xml file

in my xml file elements are not constant like say my file is

<alpha>
  <a>...</a>
  <b>...</b>
  <c>...</c>
</alpha>
<alpha>
  <a>...</a>
  <c>...</c>
</alpha>
<alpha>
  <a>...</a>
  <b>...</b>
</alpha>
<alpha>
  <a>...</a>
  <b>...</b>
  <c>...</c>
</alpha>

I meant to say i want to maintain all elements in my xml file by creating the non existing element in the set and should skip if any of the element is existed using xslt. Pls. help me to solve this problem.

开发者_Go百科Want OutPut Like as below for non existing elements with value 0 by creating in xslt.

**

<alpha>
      <a>...</a>
      <b>...</b>
      <c>...</c>
    </alpha>
    <alpha>
      <a>...</a>
      <b>0</b>
      <c>...</c>
    </alpha>
    <alpha>
      <a>...</a>
      <b>...</b>
      <c>0</c>
    </alpha>
    <alpha>
      <a>...</a>
      <b>...</b>
      <c>...</c>
    </alpha>

**


XSLT 2.0

    <xsl:template match="a|b|c">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="alpha">
        <xsl:variable name="alpha" select="."/>
        <xsl:variable name="forced">
            <forced>
                <a>0</a>
                <b>0</b>
                <c>0</c>
            </forced>
        </xsl:variable>
        <xsl:copy>
            <xsl:for-each select="$forced/forced/*">
                <xsl:variable name="current" select="name()"/>
                <xsl:choose>
                    <xsl:when test="exists($alpha/*[name() = $current])">
                        <xsl:apply-templates select="$alpha/*[name() = $current]"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="$forced/forced/*[name() = $current]"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

XSLT 1.0

<xsl:template match="/root">
    <root>
        <xsl:for-each select="alpha">
                <alpha>
                <xsl:choose>
                    <xsl:when test="a">
                        <xsl:copy-of select="a"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <a>0</a>
                    </xsl:otherwise>
                </xsl:choose>
                <xsl:choose>
                    <xsl:when test="b">
                        <xsl:copy-of select="b"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <b>0</b>
                    </xsl:otherwise>
                </xsl:choose>
                <xsl:choose>
                    <xsl:when test="c">
                        <xsl:copy-of select="c"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <c>0</c>
                    </xsl:otherwise>
                </xsl:choose>
                </alpha>
            </xsl:for-each>
    </root>
</xsl:template>


A simple, slightly modified identity transformation can do this:

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
      <xsl:if test="self::alpha">
        <xsl:if test="not(a)"><a>0</a></xsl:if>
        <xsl:if test="not(b)"><b>0</b></xsl:if>
        <xsl:if test="not(c)"><c>0</c></xsl:if>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Be aware that the above does not create the a, b, c elements in this particular order (since I don't think this is really necessary). It merely makes sure that all three of them are there, and copies the rest of the input as it is.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜