XSLT。在通过XSLT处理成HTML之前,我需要将XML预处理成其他XML。这是怎么做到的?
你好 我的XSLT将XLM页面转换为HTML页面。现在我遇到了一个问题,这对我来说似乎并不微不足道。如果能给我一个指向正确方向的指针,我将不胜感激 我想减少在原始XML文件中写入的行数。我想要的是类似于XSLT预处理器的东西,在XSLT处理之前,将一些XML标记转换成一组其他XML标记。如果可能的话,我希望在同一个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
<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>