如何使用xslt从xml文件中选择语言节点

时间:2013-05-22 22:53:55

标签: xml xslt

这是我的XML文件:

<Touren xmlns="urn:schemas-TOURDATA:SchemaExtension">
  <Tour TourID="00" LastChange="00" LastChangeBy="00" Created="00" CreatedBy="00">    
    <OBJECT_TEXT_NAME xmlns="urn:schemas-TOURDATA:Tour">
      <string xmlns="urn:TOURDATA:i18n" xml:lang="de-DE">TEXT GERMAN</string>
      <string xmlns="urn:TOURDATA:i18n" xml:lang="en-GB">TEXT ENGLISH</string>
    </OBJECT_TEXT_NAME>

    

这是我的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:td1="urn:schemas-TOURDATA:SchemaExtension" 
xmlns:td2="urn:schemas-TOURDATA:Tour">

<xsl:template match="/td1:Touren">
<xsl:apply-templates select="td1:Tour">
</xsl:apply-templates>
</xsl:template>

<xsl:template match="td1:Tour">
<p><xsl:value-of select="td2:OBJECT_TEXT_BESCHREIBUNG">!!TEXT GERMAN HERE!!</xsl:value-of></p>
<p><xsl:value-of select="td2:OBJECT_TEXT_BESCHREIBUNG">!!TEXT ENGLISH HERE!!</xsl:value-of></p>    
</xsl:template>

</xsl:stylesheet>

如何选择 de-DE en-GB string节点,以便使用xsl:value-of输出它们?

2 个答案:

答案 0 :(得分:1)

您解决string元素并应用指定@xml:lang属性值的谓词过滤器:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:td1="urn:schemas-TOURDATA:SchemaExtension" 
    xmlns:td2="urn:schemas-TOURDATA:Tour"
    xmlns:td3="urn:TOURDATA:i18n">
    <xsl:output indent="yes"/>

    <xsl:template match="/td1:Touren">
        <xsl:apply-templates select="td1:Tour">
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="td1:Tour">
        <p><xsl:value-of select="td2:OBJECT_TEXT_NAME/td3:string[@xml:lang='de-DE']"/></p>
        <p><xsl:value-of select="td2:OBJECT_TEXT_NAME/td3:string[@xml:lang='en-GB']"/></p>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

您可以使用lang function

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:td1="urn:schemas-TOURDATA:SchemaExtension" 
    xmlns:td2="urn:schemas-TOURDATA:Tour"
    xmlns:td3="urn:TOURDATA:i18n">
    <xsl:output indent="yes"/>

    <xsl:template match="/td1:Touren">
        <xsl:apply-templates select="td1:Tour" />
    </xsl:template>

    <xsl:template match="td1:Tour">
        <p><xsl:value-of select="td2:OBJECT_TEXT_NAME/td3:string[lang('de-DE')]"/></p>
        <p><xsl:value-of select="td2:OBJECT_TEXT_NAME/td3:string[lang('en-GB')]"/></p>
    </xsl:template>

</xsl:stylesheet>

这比explicitly comparing the xml:lang attributes更有优势,xml:lang属性只能在祖先元素中指定。