通过XSL获取特定字符串

时间:2013-08-23 10:55:45

标签: xml xslt

您好使用此XSL代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" version="1.0" omit-xml-declaration="yes"/>
 <xsl:template match="/">
  <xsl:copy-of select="/"/>
 </xsl:template>
</xsl:stylesheet>    

我得到这么长的XML

<?xml version="1.0" encoding="utf-8"?>
<soa:Label identifier="df0ca28f-1a41-4340-8156-e3ab0c97c559" name="JOB_LOG" description="" instance="464d2ff8-9d2d-404c-965d-907b09e08885" signature="00000000-0000-0000-0000-000000000000" xmlns:soa="urn:telestream.net:soa:core">
    <soa:Parameter type="timecode" identifier="d67ee32c-e432-4b5c-853b-739460c82617" bindable="True" name="DLUGOSC" enabled="true" disableable="false">00:00:30:00@25<soa:Condition>4949b7da-3253-490d-96b2-d0409ac406ad</soa:Condition>
        <soa:Default>00:00:00:00@29.97</soa:Default>
        <soa:IsRequired>false</soa:IsRequired>
    </soa:Parameter>
    <soa:Parameter type="uri" identifier="1c6a9bd8-a2ea-42ad-95e2-9d1ef9c305c0" bindable="True" name="FOLDER ZRODLOWY" editor="filebrowser" enabled="true" disableable="false">G:\PFR-Control\test\KU_DZIEN_ANGLI_ZWIASTUN.mxf<soa:Condition>4dbc7192-aab3-4cb4-b8bd-28ec21f2adb6</soa:Condition>
        <soa:Default />
        <soa:IsRequired>false</soa:IsRequired>
    </soa:Parameter>
    <soa:Parameter type="int64" identifier="ada72a89-51f2-400e-af9a-0d68c04f817d" bindable="True" name="WIELKOSC PLIKU" enabled="true" disableable="false">225833056<soa:Condition>fee552e0-ed39-4e15-bc0a-3f52e50f94bc</soa:Condition>
        <soa:Default>0</soa:Default>
        <soa:IsRequired>false</soa:IsRequired>
    </soa:Parameter>
    <soa:Parameter type="uri" identifier="123d14bd-3bb1-4a70-b39b-87e14b7c6b5d" bindable="True" name="New Parameter (4)" editor="filebrowser" enabled="true" disableable="false">G:\PFR-Control\test\KU_DZIEN_ANGLI_ZWIASTUN.1.mxf<soa:Condition>e02a7fc1-6a78-4ac4-a7d8-2d4e9807aafe</soa:Condition>
        <soa:Default />
        <soa:IsRequired>false</soa:IsRequired>
    </soa:Parameter>
</soa:Label>

我如何构建XSL文件才能获得 -00:00:30:00 @ 25 -22583305 G:\ KU.mov -G:\ KU2.mov

这是我从aplication获得的参数

提前感谢你的衣服

1 个答案:

答案 0 :(得分:0)

在执行任何其他操作之前,有一点需要注意,XML是使用命名空间,因此XML中的所有元素都是该命名空间的一部分。这意味着您需要在XSLT中声明相同的命名空间,以便XSLT可以匹配命名空间中的特定元素。

您可以将其声明为 xsl:stylesheet 元素的一部分:

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:soa="urn:telestream.net:soa:core">

然后您可以在模板匹配中使用前缀,以确保您正确匹配元素

 <xsl:template match="soa:Parameter">

无论如何,您当前使用的所有XSLT都是按原样复制XML而不进行任何更改,因此我猜您已经意识到输出太长的原因,因为它与输入匹配。因此,首先要做的是抛弃<xsl:template match="/">模板。

现在,XSLT具有内置&#39;的概念。当XSLT文件本身没有显式模板时,将在查找与节点匹配的模板时使用的模板。内置模板将输出它找到的任何文本节点的文本,否则它将跳过节点并继续处理其子节点。

虽然您没有完全解释,但在您的问题中,您似乎想要输出每个 soa:Parameter 元素的第一个文本节点。内置模板将自动为您执行此操作,但它也将输出 soa:Parameter 元素的所有子元素的文本。因此,您在XSLT中需要做的就是编写一个模板来忽略本例中的其他子元素

<xsl:template match="soa:Parameter/*" />

当然,如果你试过这个,你会发现它将所有参数文本连接在一个单独的字符串中,没有空格,所以你可以添加另一个模板来输出带有空格的参数文本。

试试这个XSLT

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

   <xsl:template match="soa:Parameter">
       <xsl:value-of select="concat(text(), ' ')" />
   </xsl:template>

   <xsl:template match="soa:Parameter/*" />
</xsl:stylesheet>