2017-07-26 62 views
0

我有一個輸入XML如下所示。將多個屬性連接成一個XSL

<?xml version="1.0" encoding="UTF-8"?> 
<topic title="My Topic" subtopic="My SubTopic"> 
    <table title="My Table" media="print" role="center"> 
     <thead></thead> 
     <tbody></tbody> 
    </table> 
</topic> 

我希望它能與XSL一起翻譯如下。

<?xml version="1.0" encoding="UTF-8"?> 
<topic title="My Topic" subtitle="My Subtopic"> 
    <table title="My Table" outputclass="print center"> 
     <thead></thead> 
     <tbody></tbody> 
    </table> 
</topic> 

如果您發現表中的任何其他屬性必須命名爲OutputClass類一個屬性進行串接,但不表的唯一的其他屬性的話題。

我有一個這樣的XSL -

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="xsl xsi"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" 
     standalone="no" doctype-public="-//OASIS//DTD DITA Composite//EN" doctype-system="topic.dtd"/> 

    <!-- Generic element --> 

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

    <xsl:template match="table"> 
     <table> 
      <xsl:apply-templates select="@role | @media" mode="table.att"/> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates /> 
     </table> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:if test="local-name(.)!='noNamespaceSchemaLocation'"> 
      <xsl:attribute name="{local-name()}"> 
       <xsl:value-of select="."/> 
      </xsl:attribute> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="@*" mode="table.att"> 
     <xsl:choose> 
      <xsl:when test="local-name() = 'role'"> 
       <xsl:attribute name="outputclass"> 
        <xsl:value-of select="."></xsl:value-of> 
       </xsl:attribute> 
      </xsl:when> 
      <xsl:otherwise> 
       <!-- <xsl:apply-templates select="."/> --> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

正如預期的那樣,它不會做的伎倆。你能幫我解決這個問題嗎? 我想我需要將所有屬性一起發送以連接它,但我不知道如何做到這一點。

回答

1

試試這個

<xsl:template match="table"> 
     <table> 
      <xsl:apply-templates select="@title"/> 
      <xsl:if test="@role and @media"> 
      <xsl:attribute name="outputclass"> 
       <xsl:value-of select="concat(@media, ' ', @role)"/> 
      </xsl:attribute>  
      </xsl:if> 
      <xsl:apply-templates /> 
     </table> 
</xsl:template> 
0

表中的任何其他屬性必須命名爲OutputClass類一個屬性進行串接,但不表的唯一的其他屬性的話題。

試試這樣說:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="table"> 
    <xsl:copy> 
     <xsl:copy-of select="@title"/> 
     <xsl:attribute name="outputclass"> 
      <xsl:for-each select="@*[not(name()='title')]"> 
       <xsl:value-of select="." /> 
       <xsl:if test="position()!=last()"> 
        <xsl:text> </xsl:text> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet>