문제

고 싶을 정규 표현식을 사용하는에서 선택하는 요소를 사용하여 기능입니다.아보를 사용하지 않은 외부 라이브러리(예:saxon)이 작업을 수행 할 수 있습니다.

도움이 되었습니까?

해결책

에서 몇 가지가 있 XSLT2.0 서 지원되지 않는 내장된 라이브러리(이 있었다 토론에 모노 메일링 목록에 대해 이러한 정보를 찾을 수 더 이상).하지만 대부분의 사람들은 절대로 실행한 사례는 지원되지 않습니다.

또 다른 옵션은 체크 오픈 소스 http://saxon.sourceforge.net/ 는가에 대한 지원 2.0.

편집(AB):위의 수락 응답이 혼동 될 수 있습니다.지원 기능이 없고 거기에 계획이 없는 방향으로 의 XPath2.0XSLT2.0 능합니다.NET.

다른 팁

내가 믿고 대답에서 이러한 논의는 오해의 소지가 있습니다.나는 생각한다.NET3.5 지원하지 않는 대부분의 XSL/T2.0 은 기능을(있다면 모두에서).

:

호출 2.0 은 기능은 다음과 같은 오류 메시지가 아래에 있습니다.NET3.5:

'현재 dateTime()'는 알 수 없는 XSLT 기능입니다.

나는 생각한 답변 위의 잘못된 것입니다.를 찾을 수가 없어요 어떤 증거는 Microsoft 지원 XSLT2.0.XSLT!= XPath.

향후 참조를 위해,여기에 좋은 페이지에서 확장 xpath/xquery 습니다.순:

http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=64

내가 믿지 않는 이것이 마지막 그래서 나는 그것을 복사기:


XSLT 은 변화의 언어를 XML.그것은 서버 시스템을 변환하는 소스 XML 트리에 더 적합한 형식을 위해 클라이언트입니다.XSLT 사용하여 노드 패턴 일치에 대하여 템플릿을 수행하는 변화.하지만 그것을 만드는 복잡한 변형을 비교적 간단한 몇 가지 상황을 우리가 사용하는 일부 사용자 정의됩니다.

의 일부는 상황이 우리가 할 수도 있습을 확장하 XSLT 습니다:

1)호출이 사용자 정의 비즈니스 로직
2)다른 작업을 수행에 따라 권한
3)복잡한 형식을 위해 날짜,문자열 등
4)또는 전화 webservice!!

단계 연장을 XSLT

1)사용할 객체를 사용하여 내부에서 XSLT(C#)

CustomDate custDate = new CustomDate() ;

2)제공 사용자 지정 네임스페이스 선언을 위한 사용자 정의 클래스에서 Xslt 네임스페이스 선언(XSLT 파일)

<xsl:transform
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:myCustDate="urn:custDate">

3)전달하의 인스턴스를 사용자 정의 개체,XSLT 등과 같은 네임스페이스로에서 마지막 단계(C#)

xslArgs.AddExtensionObject("urn:custDate", custDate) ;

4)사용하여 개체 내에서 XSLT(XSLT 파일)

<xsl:value-of select="myCustDate:GetDateDiff(./joiningdate)"/>

샘플 코드

우리의 예가 있다고 가정해 보겠습니다 우리는 XSLT 장 우리가 어디를 조작해야 합니다.우리가 필요한 수치를 보여 일하는 임직원과 회사입니다.이후 XSLT 가 없 native 날짜를 조작 기능을,우리가 사용하는 확장자체를 위해 우리는 작업입니다.

using System ;
using System.IO ;
using System.Xml ;
using System.Xml.Xsl ;
using System.Xml.XPath ;

public class XsltExtension{

    public static void Main(string[] args){

        if (args.Length == 2){

            Transform(args[0], args[1]) ;

        }else{

            PrintUsage() ;

        }
    }

    public static void Transform(string sXmlPath, string sXslPath){

        try{

            //load the Xml doc
            XPathDocument myXPathDoc = new XPathDocument(sXmlPath) ;

            XslTransform myXslTrans = new XslTransform() ;

            //load the Xsl 
            myXslTrans.Load(sXslPath) ;

            XsltArgumentList xslArgs = new XsltArgumentList() ;

            //create custom object
            CustomDate custDate = new CustomDate() ;

            //pass an instance of the custom object
            xslArgs.AddExtensionObject("urn:custDate", custDate) ;

            //create the output stream
            XmlTextWriter myWriter = new XmlTextWriter("extendXSLT.html", null) ;

            //pass the args,do the actual transform of Xml
            myXslTrans.Transform(myXPathDoc,xslArgs, myWriter) ;        

            myWriter.Close() ;

        }catch(Exception e){

            Console.WriteLine("Exception: {0}", e.ToString());
        }

    }

    public static void PrintUsage(){
        Console.WriteLine("Usage: XsltExtension.exe <xml path> >xsl path<") ;
    }

}

//our custom class
public class CustomDate{

    //function that gets called from XSLT
    public string GetDateDiff(string xslDate){

        DateTime dtDOB = DateTime.Parse(xslDate) ;

        DateTime dtNow = DateTime.Today ;

        TimeSpan tsAge = dtNow.Subtract(dtDOB) ;

        return tsAge.Days.ToString() ;
    }

}

이 코드를 컴파일하고 사용 제공 members.xml 고 memberdisplay.xsl 이를 실행하는 콘솔 응용 프로그램입니다.당신이 볼 수 extendXSLT.html 파일 이내에는 동일한 폴더에 있습니다.이 파일을 열고 주는 우리의 클래스 CustomDate 하기 위해 호출되었 수를 계산합의 일원이었다.

요약:
XSLT 강력한 변환의 언어를 XML,그러나 확장자를 사용하여 개체.물 C#있는지 확인해야 우리는 쉽게 달성하는 것이 불가능하거나 어렵 XSLT 혼자입니다.

Members.xml:

 <root>
    <member>
        <name>Employee1</name>
        <joiningdate>01/01/1970</joiningdate>
        <role>CTO</role>
    </member>
    <member>
        <name>Employee2</name>
        <joiningdate>24/07/1978</joiningdate>
        <role>Web Developer</role>
    </member>
    <member>
        <name>Employee3</name>
        <joiningdate>15/12/1980</joiningdate>
        <role>Tester</role>
    </member>
</root>

Memberdisplay.xsl:

<xsl:transform
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:myCustDate="urn:custDate">

<xsl:output method="html" omit-xml-declaration="yes" />     

    <xsl:template match="/">
        <html>
            <head>
                <style>
                    TABLE.tblMaster
                    {
                        border-style: solid; 
                        border-width: 1px 1px 1px 1px; 
                        border-style: solid; 
                        border-color:  #99CCCC; 
                        padding: 4px 6px; 
                        text-align: left; 
                        font-family:Tahoma,Arial;
                        font-size:9pt;

                    }
                    TD.tdHeader
                    {
                        FONT-WEIGHT: bolder;
                        FONT-FAMILY: Arial;
                        BACKGROUND-COLOR: lightgrey;
                        TEXT-ALIGN: center
                    }
                </style>
            </head>
            <body>
                <table width="50%" class="tblMaster">
                    <tr >
                        <td class="tdHeader">Employee</td>
                        <td class="tdHeader">Join date</td>
                        <td class="tdHeader">Days in company</td>
                        <td class="tdHeader">Role</td>
                    </tr>
                    <xsl:for-each select="/root/member">

                        <tr >
                            <td> <xsl:value-of select="./name"/> </td>

                            <td> <xsl:value-of select="./joiningdate"/> </td>

                            <td> <xsl:value-of select="myCustDate:GetDateDiff(./joiningdate)"/> </td>

                            <td> <xsl:value-of select="./role"/> </td>
                        </tr>   

                    </xsl:for-each>

                </table>
            </body>
        </html>
    </xsl:template>

</xsl:transform>        

토론할 때.NET 지원 XSLT2.0,XPath2.0 고 XQuery1.0,그것을 구분하는 것이 중요합니다 사이의 언어로 자신을 데이터 모델(XDM).니다.NET Framework3.5 지원하는 데이터 모델,그러나지 않는 언어입니다.그것은 최근을 설명하는 이메일을 통해 저에게 대응하여 Microsoft 의 파 Kadluczka:

는 문장"의 인스턴스 XQuery 1.0XPath2.0 데이터 모델은"혼동 될 수 있습니다 그러나 나는 그것을 믿을 말 W3C XQuery1.0 2.0 데이터 XPath 모델(XDM)spec (http://www.w3.org/TR/xpath-datamodel) 는 읽기:

[정의:의 모든 인스턴스 데이터 모델은 시퀀스입니다.].

[정의:순서는 주문 컬렉션의 영상 품목입니다.] A 순할 수 없는 구성원의 시퀀스입니다.단일 항목에 나타나는 자체로 모델링 순서 중 하나를 포함하는 항목입니다.시퀀스 에 정의된 2.5 습니다.

[정의:는 품목은 노드 또는 원자 value],

의 경우에 XPath API XPathNodeIterator 은 순서 동 XPathItem(XPathNavigator) 을 나타냅니다.

Yes,3.5XPathNavigator 지원 XSLT2.0.

http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx

"XPathNavigator 클래스에서는 시스템입니다.Xml.XPath 네임스페이스는 추상 클래스는 커서를 정의합 모델을 위한 XML 정보를 탐색 및 편집하는 항목으로 인스턴스의 XQuery1.0XPath2.0 데이터 모델입니다."

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top