2017-04-10 19 views
0

我有一個包含以下描述XML數據文件(XML文件1):選擇文本的鏈接在XML文件基於特定atttribute在當前節點的值

<?xml version="1.0" encoding="UTF-8"?> 
<Labels Version="170902"> 
    <AppointedAs>Appointed As</AppointedAs> 
    <Elder>Elder</Elder> 
    <MinisterialServant>Ministerial servant</MinisterialServant> 
    <NotAppointed>Not appointed</NotAppointed> 
</Labels> 

我也有另一個XML數據庫文件,包含關於發佈者的詳細信下面是一個剝離下來的例子來說明在手(XML文件2)問題:

<?xml version="1.0" encoding="utf-8"?> 
<PublisherDatabase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.publictalksoftware.co.uk/msa"> 
    <Publishers> 
    <Publisher Gender="Male" Appointed="MinisterialServant" Serving="Publisher"> 
     <Name>Brian Wood</Name> 
    </Publisher> 
    </Publishers> 
</PublisherDatabase> 

現在,你可以看到在XML文件2任命屬性? XML文件1中重複,其繼而包含適當的描述

做什麼,我需要我目前使用這個XSL腳本:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msa="http://www.publictalksoftware.co.uk/msa"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/> 

    <xsl:variable name="PubDB" select="document('MSA_PublisherDatabase.XML')"/> 
    <xsl:variable name="Labels" select="document('LabelsInfo.XML')"/> 
    <xsl:template match="/"> 
    <html> 
     <head> 
     <title>Publishers Report</title> 
     <link rel="stylesheet" type="text/css" href="Custom Publisher Report.css"/> 
     </head> 
     <body> 
     <table> 
      <thead> 
      <th class="cellVerticalHeading"> 
       <xsl:value-of select="$Labels/Labels/AppointedAs"/> 
      </th> 
      </thead> 
      <tbody> 
      <xsl:apply-templates select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[@Gender='Male']"> 
       <xsl:sort select="msa:Name" data-type="text" order="ascending"/> 
      </xsl:apply-templates> 
      </tbody> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="msa:Publisher"> 
    <tr> 
     <td> 
     <xsl:choose> 
      <xsl:when test="@Appointed='Elder'"> 
      <xsl:value-of select="$Labels/Labels/Elder"/> 
      </xsl:when> 
      <xsl:when test="@Appointed='MinisterialServant'"> 
      <xsl:value-of select="$Labels/Labels/MinisterialServant"/> 
      </xsl:when> 
      <xsl:when test="@Appointed='NotAppointed'"> 
      <xsl:value-of select="$Labels/Labels/NotAppointed"/> 
      </xsl:when> 
     </xsl:choose> 
     </td> 
    </tr> 
    </xsl:template> 

</xsl:stylesheet> 

以上XSL被剝離下來。正如你所看到的,@被指定的屬性的值是MinisterialServant。然後使用此值在另一個鏈接的XML文件中查找節點以獲取要顯示的文本(即部長服務人員)。

這個XSL代碼可以簡化嗎?我能否以某種方式直接使用XML文件中鏈接的另一個查找中的@Appointed屬性的值?

謝謝。

預期輸出

<html> 
     <head> 
     <title>Publishers Report</title> 
     <link rel="stylesheet" type="text/css" href="Custom Publisher Report.css"/> 
     </head> 
     <body> 
     <table> 
      <thead> 
      <th class="cellVerticalHeading"> 
       Appointed As 
      </th> 
      </thead> 
      <tbody> 
       <tr> 
        <td> 
         Ministerial servant 
        </td> 
       </tr> 
      </tbody> 
     </table> 
     </body> 
    </html> 
+1

請檢查:http://stackoverflow.com/help/how-to-ask和[mcve]。 –

+0

@ michael.hor257k請參閱修訂後的問題。 –

+1

請添加轉換給定示例的預期輸出。 –

回答

1

如果我正確理解你的要求,你可以取代你的第二個模板:

<xsl:template match="msa:Publisher"> 
    <tr> 
     <td> 
      <xsl:value-of select="$Labels/Labels/*[name()=current()/@Appointed]"/> 
     </td> 
    </tr> 
</xsl:template> 

此外,我相信你可以省事不少通過製作MSA_PublisherDatabase.XML轉換的源XML。然後你的樣式表看起來像這樣:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msa="http://www.publictalksoftware.co.uk/msa" 
exclude-result-prefixes="msa"> 
<xsl:output method="html"/> 

<xsl:variable name="labels" select="document('LabelsInfo.xml')"/> 

<xsl:template match="/msa:PublisherDatabase"> 
    <html> 
     <head> 
      <!-- ... --> 
     </head> 
     <body> 
      <table> 
       <thead> 
        <!-- ??? --> 
       </thead> 
       <tbody> 
        <xsl:apply-templates select="msa:Publishers/msa:Publisher[@Gender='Male']"> 
         <xsl:sort select="msa:Name" data-type="text" order="ascending"/> 
        </xsl:apply-templates> 
       </tbody> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="msa:Publisher"> 
    <tr> 
     <td> 
      <xsl:value-of select="$labels/Labels/*[name()=current()/@Appointed]"/> 
     </td> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 
+0

這起作用。涼。我不能讓你的第二個想法工作,但我想我知道它爲什麼失敗。我不會因爲這個原因而膨脹這個問題。我提出了另一個問題(http://stackoverflow.com/questions/43372082/including-a-xml-stylesheet-with-xmlserializer-streamwriter)因爲,我使用'XmlSerializer'我需要擴展它,讓我有選擇地指定一個'stylesheet',這樣我就可以正確地查看發佈者數據庫而無需鏈接它。但我發現與我已經有效的代碼衝突的答案。但這是一個單獨的問題。 –

相關問題