xslt - 如何指定单个节点值?

时间:2014-08-20 23:17:17

标签: xml xslt xslt-1.0

<Tags>
  <Tag TagName="#CC" TagDataType="Text" TagValue="" /> 
  <Tag TagName="#BCC" TagDataType="Text" TagValue="" /> 
  <Tag TagName="#To" TagDataType="Text" TagValue="" /> 
  <Tag TagName="#DocID" TagDataType="Text" TagValue="00000001" /> 
  <Tag TagName="#Date" TagDataType="DateTime" TagValue="20000917213300" /> 
  <Tag TagName="#Subject" TagDataType="Text" TagValue="" /> 
</Tags>


 <xsl:for-each select="Tags/Tag"> <!-- works, give me all tags -->

   <xsl:value-of select="@TagValue" />

 </xsl:for-each>        

<xsl:value-of select="Tags/Tag/@TagValue[1]" /> <!-- doesn't give me anything -

当我使用for-each时,我按列出的顺序获取所有TagValues。我现在需要以不同的顺序显示这些值。因此,我放弃了for-each并尝试使用单个语句来获取单个值,但没有成功。如何指定要显示的特定TagValue?我正在使用XSLT 1.0。

1 个答案:

答案 0 :(得分:1)

  

我现在需要以不同的顺序显示这些值。所以我   放弃了for-each

这没有任何意义。如果您希望&#34; 以不同的顺序显示这些值&#34;,则需要排序它们。请尝试以下样式表:

XSLT 1.0

<?xml version="1.0" encoding="utf-8"?>
<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:template match="/">
    <output>
        <xsl:for-each select="Tags/Tag[string(@TagValue)]">
            <xsl:sort select="string-length(substring-before('#DocID#Date#To#CC#BCC#Subject', @TagName))" data-type="number" order="ascending"/>
            <value name="{@TagName}"><xsl:value-of select="@TagValue" /></value>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

这将获取所有非空TagValue值,并按以下自定义顺序对它们进行排序:#DocID,#Date,#To,#CC,#BCC,#Subject。应用于以下测试输入时:

<Tags>
    <Tag TagName="#CC" TagDataType="Text" TagValue="" /> 
    <Tag TagName="#BCC" TagDataType="Text" TagValue="bcc recipient" /> 
    <Tag TagName="#To" TagDataType="Text" TagValue="" /> 
    <Tag TagName="#DocID" TagDataType="Text" TagValue="00000001" /> 
    <Tag TagName="#Date" TagDataType="DateTime" TagValue="20000917213300" /> 
    <Tag TagName="#Subject" TagDataType="Text" TagValue="my subject" /> 
</Tags>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <value name="#DocID">00000001</value>
   <value name="#Date">20000917213300</value>
   <value name="#BCC">bcc recipient</value>
   <value name="#Subject">my subject</value>
</output>