【问题标题】:XSL Transformation: select XPath property value based on current nodes property valueXSL 转换:根据当前节点属性值选择 XPath 属性值
【发布时间】:2021-03-24 23:03:40
【问题描述】:

将 xml 转换为 html,我想根据存储在 xml 文档中其他位置的信息为元素分配一个类名。为此,我需要将当前节点的属性值插入 XPath。我不知道该怎么做。

鉴于此 xml:

    <?xml version="1.0"?>
    <Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
     <Styles>
      <Style ss:ID="cell-ID" ss:Name="classname">
      </Style>
     </Styles>
     <Worksheet>
        <Cell ss:StyleID="cell-ID">test</Cell>
       </Worksheet>
    </Workbook>

我用过下面的XSL,但是带箭头指针的那一行不起作用:

<?xml version="1.0"?>
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
                    exclude-result-prefixes="ss"
                    version="1.0">
    <xsl:output method="html"/>
    
    <xsl:template match="/">
        <xsl:element name="style">
            <xsl:for-each select="Workbook/Styles/Style">
                #<xsl:value-of select="@ss:ID"/>
                    <xsl:if  test="@ss:Name">, .<xsl:value-of select="@ss:Name" /></xsl:if> { ... }
            </xsl:for-each>
        </xsl:element>
        <xsl:for-each select="Workbook/Worksheet/Cell">
            <xsl:element name="div">
                <xsl:attribute name="class">default</xsl:attribute>
                <xsl:if test="@ss:StyleID">
                    <xsl:attribute name="id">
                        <xsl:value-of select="@ss:StyleID"/>
                    </xsl:attribute>
                    <xsl:attribute name="class">
==>                     <xsl:value-of select="//Style[@ss:ID=@ss:StyleID]/@ss:Name"/>
                    </xsl:attribute>
                </xsl:if>
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

期望的输出是

<style>
   #cell-ID, .classname { ... }
</style>
<div class="classname" id="cell-ID">test</div>

但类名仍然为空。

非常感谢任何帮助。

【问题讨论】:

    标签: xml xslt xpath xslt-1.0


    【解决方案1】:

    XSLT 具有用于解决交叉引用的内置 key 机制。

    考虑这个最小的例子:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
    exclude-result-prefixes="ss">
    
    <xsl:key name="styl" match="Style" use="@ss:ID" />
    
    <xsl:template match="/Workbook">
        <html>
            <body>
                <xsl:for-each select="Worksheet/Cell">
                    <div class="{key('styl', @ss:StyleID)/@ss:Name}">
                        <xsl:value-of select="."/>
                    </div>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
    
    </xsl:stylesheet>
    

    应用于您问题中的输入,这将产生:

    结果

    <html>
       <body>
          <div class="classname">test</div>
       </body>
    </html>
    

    注意 (1) literal result elements 和 (2) attribute value template 的使用。

    【讨论】:

    • 非常感谢。之前我不太明白为什么要使用 key,但现在清楚多了,你帮我解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多