Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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使用xslt删除元素_Xml_Excel_Xslt - Fatal编程技术网

xml使用xslt删除元素

xml使用xslt删除元素,xml,excel,xslt,Xml,Excel,Xslt,我希望从excel文件中删除所有元素,这些元素的值以Check标记中的数字开头。 以下是我的xml文件格式: <Scans> <Results> <Check>MS-123</Check> <Result> <Grade>Error</Grade> <MachinesFound>0</MachinesFoun

我希望从excel文件中删除所有元素,这些元素的值以Check标记中的数字开头。 以下是我的xml文件格式:

<Scans>
    <Results>
        <Check>MS-123</Check>
        <Result>
            <Grade>Error</Grade>
            <MachinesFound>0</MachinesFound>
            <Machines></Machines>
        </Result>
        <Result>
            <Grade>Critical</Grade>
    </Result>
    </Results>
    <Results>
        <Check>123</Check>
        <Result>
            <Grade>Error</Grade>
        </Result>
        <Result>
            <Grade>Critical</Grade>
        </Result>
    </Results>
    <Results>
        <Check>456</Check>
        <Result>
            <Grade>Error</Grade>
        </Result>
        <Result>
            <Grade>Critical</Grade>
        </Result>
    </Results>
</Scans>

MS-123
错误
0
批评的
123
错误
批评的
456
错误
批评的
我的所有XSLT代码

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  exclude-result-prefixes="#all"
  version="2.0">

<xsl:template match="Scans">
    <HTML>
    <STYLE>
    BODY, TD, TH
        {
        font-family: Verdana;
        font-size: 10pt;
        text-align: left;
        }
    TH
        {
        background-color: #8CAAE6;
        vertical-align: bottom;
        }
    .noBB
        {
        border-bottom-style: none;
        }
    .noTB
        {
        border-top-style: none;
        vertical-align: top;
        }
    </STYLE>
    <BODY>
    <TABLE BORDER="1" BORDERCOLOR="gray" STYLE="border-collapse:collapse" CELLPADDING="2">
        <TR>
            <TH>
                Check
            </TH>
            <TH><FONT FACE="Wingdings 2" COLOR="red"    SIZE="5">&#210;</FONT><BR/>Critical</TH>
            <TH><FONT FACE="Wingdings 2" COLOR="red"    SIZE="5">&#85;</FONT>                                 
            <BR/>Restart&#160;Required</TH>
            <TH><FONT FACE="Wingdings 2" COLOR="yellow" SIZE="5">&#210;</FONT><BR/>Warning</TH>
            <TH><FONT FACE="Wingdings"   COLOR="green"  SIZE="5">&#252;</FONT><BR/>Passed</TH>
            <TH><FONT FACE="Wingdings 2" COLOR="blue"   SIZE="5">&#234;</FONT>  
            <BR/>Not&#160;approved</TH>
            <TH><FONT FACE="Wingdings 2" COLOR="blue"   SIZE="5">&#222;</FONT><BR/>Note</TH>
            <TH><FONT FACE="Verdana"     COLOR="red"    SIZE="5">!</FONT><BR/>Error</TH>
            <TH><FONT FACE="Webdings"    COLOR="blue"   SIZE="5">i</FONT><BR/>Informational</TH>
            <TH><FONT FACE="Webdings"    COLOR="blue"   SIZE="5">&#120;</FONT>              

            <BR/>Not&#160;performed</TH>
            <TH>Total</TH>
        </TR>
        <xsl:apply-templates select="Results"/>
    </TABLE>
    </BODY>
    </HTML>
 </xsl:template>

 <xsl:template match="Results">
    <TR>
        <TH VALIGN="TOP" ALIGN="LEFT" CLASS="noBB">
                <B><xsl:value-of select="Check"/></B>
                <BR/>
                <xsl:if test = "KBID != ''">
                 <I>KB:<xsl:value-of select="KBID"/></I>
                <BR/>
                </xsl:if>
            <BUTTON>
                <xsl:attribute name="ID">R1<xsl:value-of select="Check"/><xsl:value-of   select="KBID"/></xsl:attribute>
                <xsl:attribute name="ONCLICK">
                    document.all["R1<xsl:value-of select="Check"/><xsl:value-of select="KBID"/>"].style.display = 'none';
         document.all["R2<xsl:value-of select="Check"/><xsl:value-of select="KBID"/>"].style.display = '';
                </xsl:attribute>
                &gt;&gt;
            </BUTTON>
        </TH>

        <xsl:apply-templates mode="row2" select="Result[Grade='Critical']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='RestartRequired']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='Warning']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='Passed']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='NotApproved']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='Note']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='Error']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='Info']" />
        <xsl:apply-templates mode="row2" select="Result[Grade='NotPerformed']" />

        <TD VALIGN="TOP" ALIGN="RIGHT" CLASS="noBB">
            <B> <xsl:value-of select="count(Result/Machines/Machine)"/> </B>
        </TD>
    </TR>
    <TR STYLE="display:none">
        <xsl:attribute name="ID">R2<xsl:value-of select="Check"/><xsl:value-of select="KBID"/>
        </xsl:attribute>
     <TH CLASS="noTB">
     <BUTTON>
        <xsl:attribute name="ONCLICK">
              document.all["R1<xsl:value-of select="Check"/><xsl:value-of select="KBID"/>"].style.display = '';
              document.all["R2<xsl:value-of select="Check"/><xsl:value-of select="KBID"/>"].style.display = 'none';
            </xsl:attribute>
                &lt;&lt;
            </BUTTON>
        </TH>

        <xsl:apply-templates mode="row3" select="Result[Grade='Critical']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='RestartRequired']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='Warning']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='Passed']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='NotApproved']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='Note']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='Error']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='Info']" />
        <xsl:apply-templates mode="row3" select="Result[Grade='NotPerformed']" />

        <TD CLASS="noTB">&#160;</TD>
     </TR>
 </xsl:template>



 <xsl:template match="Result" mode="row2">
    <xsl:variable name="Count" select="count(Machines/Machine)" />
    <TD VALIGN="TOP">
        <xsl:if test="$Count != 0">
            <B> <xsl:value-of select="$Count"/> </B>
            (<xsl:value-of select="round (100 * $Count div            count(parent::Results/Result/Machines/Machine))"/>%)
        </xsl:if>
    </TD>
  </xsl:template>

  <xsl:template match="Result" mode="row3">
    <TD VALIGN="TOP">
        <xsl:apply-templates select="Machines/Machine" />
    </TD>
  </xsl:template>

  <xsl:template match="Machine">
    <A HREF="{@path}">
    <NOBR><xsl:value-of select="."/></NOBR>
    </A>
    <BR/>
 </xsl:template>


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


 <xsl:template match="Results[Check[matches(., '^[0-9]')]]"/>


 </xsl:stylesheet>


I need to get rid of elements like
<!--<Results>
    <Check>123</Check>
    <Result>
        <Grade>Error</Grade>
    </Result>
    <Result>
        <Grade>Critical</Grade>
    </Result>
</Results> -->

正文,TD,TH
{
字体系列:Verdana;
字号:10pt;
文本对齐:左对齐;
}
真实航向
{
背景色:#8CAAE6;
垂直对齐:底部对齐;
}
诺布先生
{
边框底部样式:无;
}
诺特先生
{
边框顶部样式:无;
垂直对齐:顶部;
}
检查
Ò
关键 U
重新启动 ;要求的 Ò
警告 ü
通过 ê
不 ;经核准的 Þ
注 !
错误 i
x
不 ;表演 全部的
KB:
R1 document.all[“R1”].style.display='none'; document.all[“R2”].style.display=''; R2 document.all[“R1”].style.display=''; document.all[“R2”].style.display='none';   (%)
我需要去除像这样的元素
对于我的XSLT,它不起作用。
有人能帮我吗?

函数
开头,使用纯字符串,而不是正则表达式。如果您使用XSLT2.0处理器,那么您可以轻松地使用
匹配项

<xsl:template match="Results[Check[matches(., '^[0-9]')]]"/>

在XSLT1.0中,使用

<xsl:template match="Results[Check[translate(substring(., 1, 1), '0123456789', '') = '']]"/>

一个完整的样品是

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  exclude-result-prefixes="#all"
  version="2.0">

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

<xsl:template match="Results[Check[matches(., '^[0-9]')]]"/>

</xsl:stylesheet>

当使用Saxon 9.5 HE执行时,输出

<?xml version="1.0" encoding="UTF-8"?><Scans>
    <Results>
        <Check>MS-123</Check>
        <Result>
            <Grade>Error</Grade>
        </Result>
        <Result>
            <Grade>Critical</Grade>
    </Result>
    </Results>

MS-123
错误
批评的

它不工作。我不知道为什么。我在这些行之前应用了其他xsl:template,因为我想把它看作一个漂亮的表。这可能是因为我没有将这些代码行放在正确的位置?我把这段代码放在文档的末尾。我真的不明白,为什么它不起作用:(我已经为您发布的示例编辑并提供了完整的示例及其输出。如果您仍然有问题,请使用必要的详细信息编辑您的问题,或者使用新的详细信息开始一个新问题,特别是如果您除了删除节点之外还有其他目的。谢谢您,Martin。我尝试了所有方法,但都是相同的。来自的元素检查带数字的艺术仍然存在。我将用所有xslt文件编辑我的问题。再次感谢。请告诉我们您使用的xslt处理器,并向我们显示您得到的结果和您想要的结果。当我使用Saxon 9.5针对示例输入运行示例xslt时,我只看到生成的
T中的三个
TR
元素ABLE
元素,第一行是包含所有标题信息的行,第二行和第三行是从包含
Check
having
MS-123
结果
元素生成的。其他两个
结果
元素不生成任何输出元素。Internet Explorer与其他浏览器一样,不支持XSLT 2.0。因此我使用XSLT/XPath 2.0
匹配的发布代码示例将不起作用。因此,将
version=“2.0”
更改为
version=“1.0”
,并使用我发布的
子字符串和
translate
的替代方法。