posts - 32, comments - 118, trackbacks - 0, articles - 0

2004年11月2日

<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:template match='/'>
    <xsl:apply-templates select='@*|node()'/>
</xsl:template>
<xsl:template match='@*|*'>
    <xsl:copy><xsl:apply-templates select='@*|node()'/></xsl:copy>
</xsl:template>
<xsl:template match='{0}'>
<xsl:element name='{1}'>
    <xsl:apply-templates select='@*|node()' />
</xsl:element>
</xsl:template>
</xsl:stylesheet>

{0} - old tag name
{1} - new tag name

posted @ 2004-11-02 10:15 yysun 阅读(806) 评论(0) 编辑

XPathDocument 是只读、随机读取 XML。
XmlDocument 是可读写、随机读取 XML。
一般如果不需要修改 XML,尽量使用 XPathDocument。

下面是两个小技巧:

1、XPathDocument 可以定义排序方式:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlxpathxpathnavigatorclassselecttopic.asp

     XPathDocument doc = new XPathDocument("booksort.xml");
     XPathNavigator nav = doc.CreateNavigator();

     //Select all books by Jane Austen.
     XPathExpression expr; 
     expr = nav.Compile("descendant::book[author/last-name='Austen']");

     //Sort the selected books by title.
     expr.AddSort("title", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);

     XPathNodeIterator iterator = nav.Select(expr);

2、用 IHasXmlNode 编辑 XPathNodeIterator 返回的 Node
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlihasxmlnodeclasstopic.asp

     XmlDocument doc = new XmlDocument();
     doc.Load("books.xml");
                         
     // Create an XPathNavigator and select all books by Plato.
     XPathNavigator nav = doc.CreateNavigator();
     XPathNodeIterator ni = nav.Select("descendant::book[author/name='Plato']");
     ni.MoveNext();

     // Get the first matching node and change the book price.
     XmlNode book = ((IHasXmlNode)ni.Current).GetNode();
     book.LastChild.InnerText = "12.95";
     Console.WriteLine(book.OuterXml);


 

posted @ 2004-11-02 10:10 yysun 阅读(1853) 评论(1) 编辑

一年多前写了 JXPath -ObjectXPathNavigator ,当时想当然地以为 ObjectXPathNavigator 已经达到了 JXPath 那样的对对象的支持程度。直到最近要用到这种功能的时候才发现ObjectXPathNavigator 差得相当的远呢。

ObjectXPathNavigator 是建立在 XPathNavigator 基础上的。XPathNavigator本身是个挺酷的东西,它提供了 DOM, SAX, Pull (Reader) 以外的另外一种 XML (只读和随机的) 处理方式。是对 XSLT 引擎与数据源之间的一个抽象层。

XSLT 引擎 - XPathNavigator - 数据源
XSLT 引擎 - XPathDocument - XML

TheServerSide.NET- .NET Custom XPathNavigator/XmlReader ... 用扩充 XPathNavigator的办法来实现用 XPath 语法来检索:文件系统、注册表、.NET 可执行文件 Code DOM。

ObjectXPathNavigator 是试图扩充 XPathNavigator 到对象容器上,例如 ArrayList,以便用 XPath 语法来检索对象。

美好的设想,可是目前 XPathNavigator 似乎主要是字符串处理,而没有对象的支持。XPathNavigator.Value 属性只能返回 string。

因此想要得到 JXPath 那样的对象是不可能的了。

Address address = (Address) JXPathContext.newContext(vendor).getValue("locations[address/zipCode='90210']/address"); 


这里, JXPath 中JXPathContext.getCurrent 返回的是对象。

ObjectXPathNavigator 只能检索一层对象容器,而不能检索嵌套对象。这是非常遗憾的。

posted @ 2004-11-02 09:42 yysun 阅读(803) 评论(1) 编辑