从XML列表中仅选择1个结果

时间:2014-05-13 12:40:13

标签: xml xslt

我很难从XML列表中选出1个结果,然后使用我的XSL文档对其进行转换。

原始XML

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <?xml-stylesheet type="text/xsl" href="transform.xsl"?>
    <data>
<index id="TimeStamp"></index>
<index id="GUID"></index>
<index id="DOC-GUID"></index>
<index id="RapportNr">074531</index>
<index id="SessionId"></index>
<index id="ClientType"></index>
<index id="WSClientIp">::1</index>
<index id="ClientIp"></index>
<index id="ClientVersion">4.0</index>
<index id="ClientId"></index>
<index id="DeviceIP"></index>
<index id="DeviceID"></index>
<index id="DeviceName"/>
<index id="DeviceModel"></index>
<index id="DeviceLocation"/>
<index id="IsDuplexScan">False</index>
<index id="Printer"></index>
<index id="PrintCount">1</index>
<index id="PrintEnabled">False</index>
<index id="Image Name">074531.tif</index>
    </data>

转换XSL

<?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"/>
<!-- Main output node -->
<xsl:template match="/DrivveImage/Documents/Document">
    <!-- Start of the output -->
    <data>
        <!-- Call field template for each 'Field' node -->
        <xsl:for-each select="/data/index">
            <xsl:call-template name="Field"/>
        </xsl:for-each>
        <!-- Output for 'Document' node attribute 'File' -->
        <index id="RapportNr">
                <value>
                ?????????
                </value>
        </index>
    </data>
    <!-- End of the output -->
</xsl:template>
<!-- Field template  -->
<xsl:template name="Field">
    <!-- This is the actual output - what ever you need per field -->
    <index>
        <xsl:attribute name="id"><xsl:value-of select="@name"/>                   </xsl:attribute>
        <!-- Output of the field text value -->
        <xsl:value-of select="."/>
     </index>
 </xsl:template>
 </xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><data>
<index id="RapportNr">
    <value>
                    074531 should be here....
    </value>
</index>
</data>

我尝试使用Value-of select和Copy-of但似乎没有什么对我有用。 所以我现在问这里是否有人可以帮我处理我的代码。

谢谢!

// Jorki

2 个答案:

答案 0 :(得分: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:template match="index[@id = 'RapportNr']">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <value>
            <xsl:value-of select="."/>
        </value>
    </xsl:copy>
</xsl:template>
<xsl:template match="node() | @*">
    <xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

我不确定XSLT中的/DrivveImage/Documents/Document指的是什么,因为我在文档的任何地方都没有看到,但这应该是你想要做的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="/Drivve">
      <xsl:apply-templates select="Documents/Document/data" />
  </xsl:template>

  <xsl:template match="data">
    <xsl:copy>
      <xsl:apply-templates select="index[@id = 'RapportNr']" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="processing-instruction()" />
</xsl:stylesheet>

在样本输入上运行时,会产生:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <index id="RapportNr">074531</index>
</data>