1

我有一个布局如下的 XML 文件:

<root>
    <node>
        <descriptors>
            <attribute attr="important"/>
        </descriptors>
        <value>
            Some
        </value>
        <value>
            text
        </value>
        <value>
            here.
        </value>
    <node>
</root>

有许多节点,每个节点都由元素中的descriptors元素来区分。我需要提取文本,以便我有这个:

<element>
    Sometexthere.
</element>

我有一个 xsl 转换:

<xsl:template match="//attribute[@attr='important']">
    <element>
        <xsl:for-each select="../../value">
            <xsl:value-of select="." />
        </xsl:for-each>
    </element>
</xsl:template>

这只是将所有value元素写入文件中的每个node元素。我想我并不真正理解作用域的工作方式(比如.指向当前元素/节点的时间,但循环中的当前元素/节点是什么)。

我应该如何处理这个?

编辑

我实际的 xsl 样式表(我正在转换一个 docx 文件):

<xsl:template match="/">
        <order>
            <xsl:apply-templates/>
        </order>
    </xsl:template> 
    <xsl:template match="/w:document/w:body/w:p[w:pPr/w:pStyle/@w:val='Pealkiri1']">
        <name>
            <xsl:for-each select="w:t">
                <xsl:value-of select="." />
            </xsl:for-each>
        </name>
    </xsl:template>
4

1 回答 1

2

您可以尝试匹配node包含的元素descriptors/attribute/@attr=...而不是attribute元素本身。

然后for-each上下文将相对于 that node

<xsl:template match="/">
    <order>
        <xsl:apply-templates select="//node[descriptors/attribute/@attr='important']" />
    </order>
</xsl:template> 

<xsl:template match="node">
    <element>
        <xsl:for-each select="value">
            <xsl:value-of select="." />
        </xsl:for-each>
    </element>
</xsl:template>
于 2013-07-18T10:25:27.860 回答