对于type = CHOICE的每个属性元素,我想整理选择元素。所以给出:
<property>
<name>lookup_mode</name>
<type>CHOICE</type>
<defaultValue>1</defaultValue>
<choices>
<value>1</value>
<value>2</value>
<value>3</value>
</choices>
<choiceNames>
<value>Challenge</value>
<value>Pass Through</value>
<value>Not Supported</value>
</choiceNames>
</property>
输出是:
<property>
<name>lookup_mode</name>
<type>CHOICE</type>
<defaultValue>1</defaultValue>
<choices>
<choice>
<index>1</index>
<choiceName>Challenge</choiceName>
</choice>
<choice>
<index>2</index>
<choiceName>Pass Through</choiceName>
</choice>
<choice>
<index>3</index>
<choiceName>Not Supported</choiceName>
</choice>
</choices>
</property>
我试过模板:
<xsl:template match="propertyDescriptor[type/text()='CHOICE']">
<xsl:copy>
<choices>
<xsl:for-each select="choices/value">
<choice>
<index><xsl:value-of select="."/></index>
<choiceName><xsl:value-of select="../../choiceNames/value"/></choiceName>
</choice>
</xsl:for-each>
</choices>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
如果我使用该选项作为循环的索引,则每个选项都会重复choiceName值,反之亦然:
<property>
<choices>
<choice>
<index>0</index>
<choiceName>Challenge Pass Through Not Supported</choiceName>
</choice>
<choice>
<index>1</index>
<choiceName>Challenge Pass Through Not Supported</choiceName>
</choice>
<choice>
<index>2</index>
<choiceName>Challenge Pass Through Not Supported</choiceName>
</choice>
</choices>
...
我跟随XSLT Jumpstarter(2015),其中作者在第6章“更改内容的结构和顺序”中处理类似的操作。不包括元素排序规则(如打印机页面排序规则)。我认为有一些股票模式可以遵循? 提前谢谢。
答案 0 :(得分:0)
您正在寻找的结果可以通过以下方式实现:
<xsl:template match="property[type='CHOICE']">
<xsl:copy>
<xsl:copy-of select="name | type | defaultValue"/>
<choices>
<xsl:for-each select="choices/value">
<xsl:variable name="i" select="position()" />
<choice>
<index>
<xsl:value-of select="."/>
</index>
<choiceName>
<xsl:value-of select="../../choiceNames/value[$i]"/>
</choiceName>
</choice>
</xsl:for-each>
</choices>
</xsl:copy>
</xsl:template>
你的尝试不起作用的(主要)原因是你的指示:
<xsl:value-of select="../../choiceNames/value"/>
选择所有 choiceNames/value
个节点并返回第一个节点(在XSLT 1.0中)或所有节点(在XSLT 2.0中)的字符串值,而不考虑{{1 node是当前的。