xml标记作为参数传递给xsl

时间:2012-10-29 07:15:33

标签: html xml xslt tags

如何修改下面的xsl来处理值为tags的参数。而不是使用w:p和w:pPr / w:pStyle / @ w:val我将它们作为args传递

实际XSl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
>
<xsl:param name="styleName"/>
<xsl:output method="text"/>
<xsl:template match="w:p"/>
<xsl:template match="w:p[w:pPr/w:pStyle/@w:val[matches(., concat('^(',$styleName,')$'),'i')]]"> 
    <xsl:value-of select="."/><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>

必需的XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">

<xsl:param name="styleName" select="'articletitle'"/>
<xsl:param name="para" select="'//w:p[w:pPr/w:pStyle/@w:val[matches(.,concat('^(',$styleName,')$')]]'"/>

<xsl:output method="text"/>

    <xsl:template match="/">                
         <xsl:for-each select="$para">
                <xsl:value-of select="."/><xsl:text>&#10;</xsl:text>
         </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

注意:您应该习惯于提供有关您使用的xslt版本和处理器的信息。在这种情况下,只有在使用XSLT 2.0

时,答案才有效

这不是一个完整的答案,但你可以从这个方法开始:

尝试使用local-name和in-scope-prefixes(仅在XSLT 2.0中可用)来动态匹配节点。

这里有一个替换空模板的示例模板:

<xsl:template match="*[local-name()=substring-after($para,':') and in-scope-prefixes(.)[.=substring-before($para,':')]]"/>

对于表达式的第二部分($ parastyle),我只能考虑编写自己的函数来动态评估它。

我稍后会尝试发布此类功能的示例。

答案 1 :(得分:0)

我在编码中发现问题,在第二行,

<xsl:param name="para" select="'//w:p[w:pPr/w:pStyle/@w:val[matches(.,concat('^(',$styleName,')$')]]'"/>

由于我在select属性中给出了引号,因此该值被视为字符串而不是xpath表达式。