Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 我的XPATH表达式选择的节点集不正确_Xml_Xslt_Xpath - Fatal编程技术网

Xml 我的XPATH表达式选择的节点集不正确

Xml 我的XPATH表达式选择的节点集不正确,xml,xslt,xpath,Xml,Xslt,Xpath,我试图自学XSL和XPATH。我有一个由我们的一个商业工具创建的示例XML文档,我想提取某些节点值并创建一个CSV文件作为输出。XML文档的截断示例如下: <?xml version="1.0" encoding="windows-1252"?> <xml_report> <form id= "WOI:WorkOrder" xmlns="http://www.w3.org/2000/xforms"> <mode l>

我试图自学XSL和XPATH。我有一个由我们的一个商业工具创建的示例XML文档,我想提取某些节点值并创建一个CSV文件作为输出。XML文档的截断示例如下:

<?xml version="1.0" encoding="windows-1252"?>
<xml_report> 
  <form id= "WOI:WorkOrder" xmlns="http://www.w3.org/2000/xforms">
     <mode l>
        < group name="field-info" minOccurs="1" maxOccurs="1">
            <group name="field" minOccurs="1" maxOccurs="*">
               <string name="name" />
               <number name="id" long="true" />
               <string name="type" range="closed">
                  <value>CHAR</value>
                  <value>TIME</value>
                  <value>DECIMAL</value>
                  <value>REAL</value>
                  <value>INT</value>
                  <value>ENUM</value>
                  <value>ATTACH</value>
                  <value>DIARY</value>
                  <value>TIMEOFDAY</value>
                 <value>DATE</value>
                 <value>CURRENCY</value>
                 <value>NULL</value>
              </string>
           </group>
           <!-- Additional group nodes -->
        </group>
     </model>
     <instance>
        <field-info>
           <field>
              <name>Work Order ID*&#43;</name>
              <id>1000000182</id>
              <type> CHAR</type>
           </field>
           <!-- Additional field nodes -->
        </field-info>
        <entry>
           <field_value>
              <value>WO0000000498983</value>
           </field_value>
           <field_value>
              <value>New Host name for new server build</value>
           </field_value>
        </entry>
        <!-- Additional entry nodes -->
     </instance>
  </form>
</xml_report>
问题是,我实际上提取了节点列表前面的所有元素的值,以及不需要的缩进和行距。我认为在模板匹配和每个标记中指定限制性XPATH表达式就足够了,但事实并非如此。如何将所选节点的范围缩小到仅限我实际想要使用的节点?如果有帮助的话,我将在Windows7上使用SAXON作为XSLT处理引擎

              CHAR
              TIME
              DECIMAL
              REAL
              INT
              ENUM
              ATTACH
              DIARY
              TIMEOFDAY
              DATE
              CURRENCY
              NULL








           Work Order ID*+
           1000000182
            CHAR





           WO0000000498983


           New Host name for new server build

由于表单元素的输入XML中存在命名空间,因此无法获得所需的输出:

<form id="WOI:WorkOrder" xmlns="http://www.w3.org/2000/xforms">
将第4行中的
改为
应用于示例XML时,会产生以下输出:

WO0000000498983,New Host name for new server build,
WO0000000498983,New Host name for new server build,
为了避免误解-在这个XSLT中,我刚刚将xforms名称空间添加为
xmlns:xforms
,不必这样命名。例如,可以将其声明为
xmlns:xfo=”http://www.w3.org/2000/xforms“
,然后将
更改为
(对于当前前缀为
xforms:
)的其他元素也将其更改)

在使用XSLT2.0时,还可以将
xforms
名称空间声明为
xpath默认名称空间
,因为您只针对该名称空间中的元素。调整后的XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xpath-default-namespace="http://www.w3.org/2000/xforms">
<xsl:output method="text" omit-xml-declaration="yes" 
            indent="yes" encoding="utf-8" media-type="text/plain" />
<xsl:template match="//form">
    <xsl:apply-templates select="instance"/>   
</xsl:template>
<xsl:template match="instance">
<xsl:for-each select="entry/field_value">
     <xsl:value-of select='value' /><xsl:text>,</xsl:text>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

,
产生相同的输出。因为
xforms
默认名称空间
,所以不需要添加额外的名称空间和元素前缀。
此版本中的另一个调整是匹配
表单
,而不是
xml_报告
,因为
xml_报告
没有
xforms
命名空间

作为名称空间的参考,例如,您可以在

WO0000000498983,New Host name for new server build,
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xpath-default-namespace="http://www.w3.org/2000/xforms">
<xsl:output method="text" omit-xml-declaration="yes" 
            indent="yes" encoding="utf-8" media-type="text/plain" />
<xsl:template match="//form">
    <xsl:apply-templates select="instance"/>   
</xsl:template>
<xsl:template match="instance">
<xsl:for-each select="entry/field_value">
     <xsl:value-of select='value' /><xsl:text>,</xsl:text>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>