Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT。在通过XSLT处理成HTML之前,我需要将XML预处理成其他XML。这是怎么做到的?_Xml_Xslt_Preprocessor - Fatal编程技术网

XSLT。在通过XSLT处理成HTML之前,我需要将XML预处理成其他XML。这是怎么做到的?

XSLT。在通过XSLT处理成HTML之前,我需要将XML预处理成其他XML。这是怎么做到的?,xml,xslt,preprocessor,Xml,Xslt,Preprocessor,你好 我的XSLT将XLM页面转换为HTML页面。现在我遇到了一个问题,这对我来说似乎并不微不足道。如果能给我一个指向正确方向的指针,我将不胜感激 我想减少在原始XML文件中写入的行数。我想要的是类似于XSLT预处理器的东西,在XSLT处理之前,将一些XML标记转换成一组其他XML标记。如果可能的话,我希望在同一个XML文档中保留替换行和替换行(因此,不包括文件样式的解决方案) 例如: 通常,我的XML文件包含重复的多行,例如以下简化的代码段: <img> <u

你好

我的XSLT将XLM页面转换为HTML页面。现在我遇到了一个问题,这对我来说似乎并不微不足道。如果能给我一个指向正确方向的指针,我将不胜感激

我想减少在原始XML文件中写入的行数。我想要的是类似于XSLT预处理器的东西,在XSLT处理之前,将一些XML标记转换成一组其他XML标记。如果可能的话,我希望在同一个XML文档中保留替换行和替换行(因此,不包括文件样式的解决方案)

例如:

通常,我的XML文件包含重复的多行,例如以下简化的代码段:

<img>
        <url>a_midi.jpg</url>
</img>
<img>
        <url>b_midi.jpg</url>
</img>
<img>
        <url>c_midi.jpg</url>
</img>

a_midi.jpg
b_midi.jpg
c_midi.jpg
如果我能将这些多行包含到一个宏标记中,放在XML文件开头的某个地方,那就太好了,如下所示:

<macro id="name_a">
        <img>
                <url>a_midi.jpg</url>
        </img>
        <img>
                <url>b_midi.jpg</url>
        </img>
        <img>
                <url>c_midi.jpg</url>
        </img>
</macro>

a_midi.jpg
b_midi.jpg
c_midi.jpg
我不想在不同的地方一遍又一遍地重复最初的几行,我只想使用以下内容:

 <use_macro id="name_a"/>
<xsl:apply-templates  select="exsl:node-set($xml_whith_use_macro_extended)/*" />

现在,当遇到*use\u macro*标记时,我当然可以指示XSLT处理与名称“name\u a”匹配的模板宏

然而,这不是我想要的。原因是,上面的img标记本身包含在另一个周围的标记中,例如*multi_img*。处理此标记的XSLT考虑了包含在其自身中的许多其他标记,这些标记指示如何将XML准确地转换为HTML(有时img标记甚至需要以不同的方式多次处理)

因此,我所寻找的是一种

(1) 首先将XML*use_macro*转换为包含在宏标记中的XML

(2) 然后使用XSLT处理生成的XML,就像根本没有*use_macro*标记一样

可能解决方案是显而易见的,我只是工作过度,但我找不到我需要的(即使在花了一些时间学习Jeni Tennison的“XSLT和XPath/On the edge”之后)

我很欣赏一些指点(也可以参考坦尼森书中的相应章节),或者只是“这是不可能做到的”这句话。提前谢谢

问候,,
赫伯

听起来你需要做两个步骤。 显然,最简单的解决方案可能是生成一个临时xml文件。只有
use\u宏
扩展的。然后调用此临时文件的原始xslt

仅使用一个xlst处理器调用执行这两个步骤取决于xslt版本

在xslt-1.0中,您需要使用像
node-set()这样的扩展。

作为第一步,使用完整的xml文件生成一个变量,但
使用\u宏
扩展。
而不是应用原始XLST,例如:

 <use_macro id="name_a"/>
<xsl:apply-templates  select="exsl:node-set($xml_whith_use_macro_extended)/*" />

对于xsltpoc,这将执行以下操作:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:exsl="http://exslt.org/common"  exclude-result-prefixes="exsl"
                    >
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@*|node()" mode="extend">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="extend"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="macro"  mode="extend" />
    <xsl:template match="use_macro"  mode="extend" >
        <xsl:copy-of select="//macro[@id = current()/@id]" />
    </xsl:template>


    <xsl:template match="@*|node()" >
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:variable name="xml_whith_use_macro_extended"  >
        <xsl:apply-templates mode ="extend" select="/*" />
    </xsl:variable>

    <xsl:template match="/">
        <xsl:apply-templates  select="exsl:node-set($xml_whith_use_macro_extended)/*" />
    </xsl:template>

    <!-- other temlates -->

</xsl:stylesheet>

听起来您必须执行两个步骤。 显然,最简单的解决方案可能是生成一个临时xml文件。只有
use\u宏
扩展的。然后调用此临时文件的原始xslt

仅使用一个xlst处理器调用执行这两个步骤取决于xslt版本

在xslt-1.0中,您需要使用像
node-set()这样的扩展。

作为第一步,使用完整的xml文件生成一个变量,但
使用\u宏
扩展。
而不是应用原始XLST,例如:

 <use_macro id="name_a"/>
<xsl:apply-templates  select="exsl:node-set($xml_whith_use_macro_extended)/*" />

对于xsltpoc,这将执行以下操作:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:exsl="http://exslt.org/common"  exclude-result-prefixes="exsl"
                    >
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@*|node()" mode="extend">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="extend"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="macro"  mode="extend" />
    <xsl:template match="use_macro"  mode="extend" >
        <xsl:copy-of select="//macro[@id = current()/@id]" />
    </xsl:template>


    <xsl:template match="@*|node()" >
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:variable name="xml_whith_use_macro_extended"  >
        <xsl:apply-templates mode ="extend" select="/*" />
    </xsl:variable>

    <xsl:template match="/">
        <xsl:apply-templates  select="exsl:node-set($xml_whith_use_macro_extended)/*" />
    </xsl:template>

    <!-- other temlates -->

</xsl:stylesheet>