XSLT:使用Variable来存储和重用Attribute Value

时间:2016-09-23 14:15:05

标签: xml xpath xslt-2.0

我正在尝试在XML文档中进行更改,并且通过存储和重用属性值来解决问题。

变量存储来自相同重复元素的所有值。但我希望它只存储和重用当前Element的值。

这是我的XSLT:

    <!-- set them -->
    <xsl:variable name="Signatur" select=".//Field[@Type='2950']/@Value"/>
    <xsl:variable name="Datum" select=".//Field[@Type='9920']/@Value"/>

    <xsl:template match=".//Field[@Type='8450']/Field[@Type='8540']"/>

    <xsl:template match=".//Field[@Type='8450']">
        <h1:Field Type="8450" Value="digitale Reproduktion">
            <!-- use them -->
            <h1:Field Type="8540" Value="{$Signatur}"/>
            <h1:Field Type="8494" Value="{$Datum}"/>
            <xsl:apply-templates/>
        </h1:Field>
    </xsl:template>

2 个答案:

答案 0 :(得分:0)

  

变量Signatur和Datum存储来自第一和第二文档的两个值。但是我希望它们只存储和重用当前文档中的值。

看起来你根本不想使用变量。为什么不简单地对要输出的节点进行相对引用?

<xsl:template match="Document/Field[@Type='8450']">
    <h1:Field Type="8450" Value="digitale Reproduktion">
        <h1:Field Type="8540" Value="{Field[@Type='8540']}"/>
        <h1:Field Type="8540" Value="{Field[@Type='8470']}"/>
        <xsl:apply-templates/>
    </h1:Field>
</xsl:template>

请注意,匹配表达式不必是相对于任何内容的完整XPath表达式。只需说明模板应匹配的节点,即代替

<xsl:template match=".//Field[@Type='8450']">

使用

<xsl:template match="Field[@Type='8450']">

答案 1 :(得分:0)

好吧,一位同事帮助了我。 previous-sibling制作技巧:

 <xsl:template match=".//Field[@Type='8450']">
    <xsl:variable name="Signatur" select="preceding-sibling::Field[@Type='ob28']/Field[@Type='2950']/@Value"/>
    <xsl:variable name="Datum" select="preceding-sibling::Field[@Type='9920']/@Value"/>
    <h1:Field Type="8450" Value="digitale Reproduktion">
        <!-- use them -->
        <h1:Field Type="8540" Value="{$Signatur}"/>
        <h1:Field Type="8494" Value="{$Datum}"/>
        <xsl:apply-templates/>
    </h1:Field>
</xsl:template>