如何计算创建的节点XSL?

时间:2017-07-21 11:53:58

标签: xslt

我问自己一个问题。 我正在进行项目,我将.XML文件转换为另一个(处理后),但我要编号。我知道count(// node)函数,但我不认为我们可以计算创建的节点。

例如,这就是我的.xsl的样子:

<xsl:template match="/">
    <Type>
        <List>
            <xsl:apply-templates mode="PartOne" select="/Stuff/Info/TypeA"/>
            <xsl:apply-templates mode="PartOneBis" select="/Stuff/Info/TypeB"/>
        </List>
        <AnotherList>
            <xsl:apply-templates mode="PartTwo" select="/Stuff/Info/TypeB"/>
        </AnotherList>
    </Type>
</xsl:template>

<xsl:template mode="PartOne" match="/Stuff/Info/TypeA">
    <PartOne indexlist="{position()-1}">
        ... treatment ...
    </PartOne>
</xsl:template>

<xsl:template mode="PartOneBis" match="/Stuff/Info/TypeB">
    <xsl:if test="TypeB_Indice != 'stuff'">
        <PartOne indexlist="{count(//TypeA) + position()-1}">
            ... treatment ...
        </PartOne>
    </xsl:if>
</xsl:template>

<xsl:template mode="PartTwo" match="/Stuff/Info/TypeB">
    <xsl:if test="TypeB_Indice = 'stuff'">
        <PartTwo indexlist="{count(//TypeA) + position()-1}">
            ... treatment ...
        </PartTwo>
    </xsl:if>
</xsl:template>

这就是我的.xml的样子:

<Stuff>
    <Info>
        <TypeA> 
            <TypeA_Stuff/>
            <TypeA_Indice>xxx</TypeA_Indice>
        </TypeA>
        <TypeB>
            <TypeB_Stuff/>
            <TypeB_Indice>xxx</TypeB_Indice>
        </TypeB>
    </Info>
</Stuff>

---------------------- edit --------------------- -------

PartOneBis的条件比我在此代码中添加的条件更令人担忧,更像是6个不同的因素可以将其状态从ok更改为ok。 我想的是一个for-each有一个if和一个增量,但这不起作用,因为你不能覆盖变量或者我的方法可能是错的。 如果有一种方法可以在你的点之前创建节点,而不必创建两个.xml或者使用c ++函数,我想知道它。

感谢。

我需要把&#34; partOne&#34;首先输入&#34; partTwo&#34;第二,但在我得到的xml中,有一些条件使TypeB成为partOne,否则其他情况将成为partTwo。

TypeA - &gt; partOne

TypeB - &gt; if(something)partOne else partTwo

但是这个条件取决于几个不是来自同一个节点的值,但想要的结果是那样的

<PartOne indexlist="0">
        SomeStuff
</PartOne>
<PartOne indexlist="1">
        SomeStuff
</PartOne>
<PartTwo indexlist="2">
        SomeStuff
</PartTwo>

1 个答案:

答案 0 :(得分:0)

我发现无法效仿你的榜样。考虑一个更简单的一个:

<强> XML

<input>
    <item>red</item>
    <item>red red</item>
    <item>red blue</item>
    <item>red green</item>
    <item>blue</item>
    <item>blue blue</item>
    <item>blue green</item>
    <item>blue red</item>
    <item>green</item>
</input>

XSLT 1.0

<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:strip-space elements="*"/>

<xsl:template match="/input">
    <xsl:variable name="red-items" select="item[contains(., 'red')]" />
    <xsl:variable name="blue-items" select="item[contains(., 'blue')]" />
    <output>
        <red-list>
            <xsl:apply-templates select="$red-items"/>
        </red-list>
        <blue-list>
            <xsl:apply-templates select="$blue-items">
                <xsl:with-param name="n" select="count($red-items)"/>
            </xsl:apply-templates>
        </blue-list>
    </output>
</xsl:template>

<xsl:template match="item">
    <xsl:param name="n" select="0"/>
    <item i="{$n + position()}">
        <xsl:value-of select="." />
    </item>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <red-list>
    <item i="1">red</item>
    <item i="2">red red</item>
    <item i="3">red blue</item>
    <item i="4">red green</item>
    <item i="5">blue red</item>
  </red-list>
  <blue-list>
    <item i="6">red blue</item>
    <item i="7">blue</item>
    <item i="8">blue blue</item>
    <item i="9">blue green</item>
    <item i="10">blue red</item>
  </blue-list>
</output>