用XSLT替换f:facet属性

时间:2017-12-17 02:35:10

标签: xslt xhtml

我正在尝试通过XSLT转换这个XML:

<app:formField type="display" styleClass="col-6">
    <f:facet name="label">
        <h:outputText value="#{messages['test']}"/>
    </f:facet>
    <h:inputText name="test"/>
</app:formField>

到这个输出:

<app:formField type="display" styleClass="col-6" label="#{messages['test']}">
    <h:inputText name="test"/>
</app:formField>

(添加标签属性并删除f:facet name =“label”)

如何使用XSLT实现这一目标?我尝试了多个想法但没有一个有效:(

谢谢!

1 个答案:

答案 0 :(得分:0)

作为一个例子,我把你的XML部分如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="https://www.w3schools.com/furniture">
    <app:formField type="display" styleClass="col-6">
        <f:facet name="label">
            <h:outputText value="#{messages['test']}"/>
        </f:facet>
        <h:inputText name="test"/>
    </app:formField> 
</root>

然后在XSL中可以使用已定义的必需属性集并将其用于<app:formField>块,如下所示:

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:app="http://schemas.android.com/apk/res-auto" 
                xmlns:h="http://www.w3.org/TR/html4/" 
                xmlns:f="https://www.w3schools.com/furniture"> 
    <xsl:output method="xml" />
    <!--create attribute structure as by requirements-->
    <xsl:attribute-set name="formField-attr-set">
        <xsl:attribute name="{name(/root/app:formField/@type)}">
            <xsl:value-of select="/root/app:formField/@type"/>
        </xsl:attribute>
        <xsl:attribute name="{name(/root/app:formField/@styleClass)}">
            <xsl:value-of select="/root/app:formField/@styleClass"/>
        </xsl:attribute> 
        <xsl:attribute name="{/root/app:formField/f:facet/@name}">
            <xsl:value-of select="/root/app:formField/f:facet/h:outputText/@value"/>
        </xsl:attribute>               
    </xsl:attribute-set>

    <xsl:template match="/root">
        <root>
            <!--apply already defined attribute set-->
            <xsl:element name="app:formField" use-attribute-sets="formField-attr-set">
               <xsl:copy-of select="/root/app:formField/h:inputText"/>
            </xsl:element>          
        </root>       
    </xsl:template>
</xsl:stylesheet>

结果如预期:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="https://www.w3schools.com/furniture" xmlns:app="http://schemas.android.com/apk/res-auto">
    <app:formField type="display" styleClass="col-6" label="#{messages['test']}">
        <h:inputText name="test"/>
    </app:formField>
</root>